Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Подскажите куда копать.  (Прочитано 8546 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PapooAss
Интересующийся

ru
Offline Offline

« : 23-01-2017 11:55 » 

Всем доброго здоровьичка!
подскажите несведущему в какую сторону двигаться и где лучше копать?

Дано: графический файл в формате bmp. не шибко большого размера. в нем идут пиксели сначала одного цвета, затем другого. при чем длина пикселей одного цвета абсолютно разная.

Задача: попиксельно, построчно проанализировать файл и в местах стыка двух цветов-поставить взамен одного-другой-с усредненной цветовой гаммой (например белый-черный=серый)

как я вижу реализацию: в идеале хотелось бы иметь графический интерфейс, где можно из каталога выбрать файл, иметь возможность проверки в автоматичском режиме (по всей цветовой гамме) а так же иметь возможность выбрать принудительно цвет А и цвет Б и чтобы только ЭТИ цвета проверялись. Ну и чтобы сохранялся новый файл в заданную директорию.


Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #1 : 23-01-2017 12:46 » 

Для начала определиться с целевой платформой, языком программирования, и инструментами, которые определят степень требуемого погружения в детали. Если это задание даёт преподаватель, то эти моменты стоит сперва уточнить у него.
Записан
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #2 : 23-01-2017 17:38 » 

Задача не учебная, а вполне себе реальная.
Платформа? Ну когда-то программировал в BASIC-е, еще на Spectrum.
еще в институте что-то там делал в VisualBasic.
сейчас пишу код только в 1С.
на нем точно эту задачу не выполнишь Улыбаюсь))
поэтому ответ вопрос какая платформа, отвечу: какую посоветуете, какая эффективнее позволит с этим справиться. но чтобы без лишних заморочек. Простота и эффективность-вот мой слоган.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-01-2017 19:48 » 

1c так 1c, чего дергаться?
Т.е. интрефейс по выбору файла у вас уже есть, осталось прикрутить только gdi

https://habrahabr.ru/post/176717/
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #4 : 23-01-2017 20:42 » 

1С не пойдет как платформа-поскольку компьютер не домашний, а значит должно отсутствовать нелицензионное ПО. А на покупку лицензии-вряд ли кто согласится. да и незачем. Я вижу это как отдельный исполняемый файл со встроенной формой интерфейса.
Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #5 : 23-01-2017 21:42 » 

Платформа? Ну когда-то программировал в BASIC-е, еще на Spectrum.
еще в институте что-то там делал в VisualBasic.

поэтому ответ вопрос какая платформа, отвечу: какую посоветуете, какая эффективнее позволит с этим справиться. но чтобы без лишних заморочек.

Простота и эффективность-вот мой слоган.
Если речь об изучении нового языка, имхо, более профессионально "С/С++".

Если целевая платформа Windows, то в рамках языка можно использовать:
MS Visual Studio https://www.visualstudio.com/ru/downloads/

Если требуется кроссплатформенность, то:
Qt Creator https://www.qt.io/ide/

Заморочки - это будни, и их придётся решать - вдумчиво, шаг за шагом, досконально... От них не уйти, всегда будут ошибки - Ваши и чужие, всегда нюансы. Задача инженера разбираться и решать. Не всегда кажущийся путь оказывается кратчайшим.

Да, этот слоган я тоже люблю, самое простое, это отказаться от графического интерфейса, установить GIMP или Corel PhotoPaint или аналог в виде любого современного графического редактора, и в скрипте написать требуемую обработку. То, что Вы хотите сделать очень напоминает эффект размывания с шириной в один пиксель. Может это именно то, что нужно?
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 24-01-2017 04:50 » 

при чем длина пикселей одного цвета абсолютно разная.

а что есть длина пикселя ? Улыбаюсь

Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-01-2017 10:19 » 

при чем длина пикселей одного цвета абсолютно разная.

а что есть длина пикселя ? Улыбаюсь


Это не важно - последовательность пикселей одного цвета

Цитата
1С не пойдет как платформа-поскольку компьютер не домашний, а значит должно отсутствовать нелицензионное ПО.
Какого ПО?

Вы пробовали? то что в приведенном примере?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #8 : 25-01-2017 10:24 » 

при чем длина пикселей одного цвета абсолютно разная.

а что есть длина пикселя ? Улыбаюсь


неправильно выразился. читать как последовательность пикселей одного цвета

Добавлено через 21 минуту и 50 секунд:
Цитата
1С не пойдет как платформа-поскольку компьютер не домашний, а значит должно отсутствовать нелицензионное ПО.
Какого ПО?
Вы пробовали? то что в приведенном примере?
[/quote]
Давайте оставим этот разговор насчет 1С. это не подходит                                                         априори. Чуть позже я напишу полный алгоритм , по которому программа должна работать, с примерами и иллюстрациями.
« Последнее редактирование: 25-01-2017 10:46 от PapooAss » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 25-01-2017 13:08 » 

PapooAss, как я понимаю, задача сводится к двум шагам:
1) увеличить изображение в 2 раза без антиалиазинга
2) обратно уменьшить в 2 раза с антиалиазингом

в результирующем изображении на границах цветовых областей произойдёт смешение цветов
Записан

Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #10 : 25-01-2017 13:30 » 

в результирующем изображении на границах цветовых областей произойдёт смешение цветов
Добавлю: и куда результат записывать? Делить поровну от границы?

Предположим исходный фрагмент:
Код:
{
{255, 255, 255, 255,   0},
{255, 255, 255,   0,   0},
{255, 255,   0,   0,   0},
{255,   0,   0,   0,   0},
{  0,   0,   0,   0,   0}
};

Предположим результат:
Код:
{
{255, 255, 255, 127, 127},
{255, 255, 127, 127,   0},
{255, 127, 127,   0,   0},
{127, 127,   0,   0,   0},
{  0,   0,   0,   0,   0}
};

Так?
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 25-01-2017 13:48 » 

Aether,

а я вот идею то высказал, а как оно делается - даже не задумался сначала )) На пальцах попробовал - с ходу не осилил

Но я даже уверен, что всё это имеет какой-нибудь термин. Только я его не знаю
Записан

Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #12 : 25-01-2017 15:01 » 

Но я даже уверен, что всё это имеет какой-нибудь термин. Только я его не знаю
Я тоже не знаю, как это называется.

Для меня была бы большая проблема в отработке формата. BMP лишь кажется простым, а на деле это контейнер с кучей разновидностей внутри. Худший вариант, когда внутри изображение с заданной палитрой, но самый распространённый вариант RGB24. В рамках Qt, если я правильно помню есть класс QImage, который позволяет уйти от проблем с загрузкой и сохранением изображения, и в то же время предоставляет прямой доступ к матрице пикселей.

Соответственно, если нет ограничения по объёму памяти в задании, то:
1) Создать приложение в QtCreator.
2) Создать объект QImage1. И загрузить в него изображение.
3) Создать объект QImage2 такого же размера, как QImage1.
4) Создать двойной цикл, и проехать им по всему полю обеих матриц. Не забыть при этом, что каждое поле цветов должно обрабатываться отдельно.
5) Расчётная формула у меня была бы для "смягчения" изображения по каждой отдельной плоскости цвета:
q2[i, j] = ( 8 * q1[i, j] +
q1[i + 1, j] + q1[i - 1, j] + q1[i, j + 1] + q1[i, j - 1] +
q1[i + 1, j + 1] + q1[i - 1, j + 1] + q1[i + 1, j - 1] + q1[i - 1, j - 1] ) / 16;
Можно, конечно, подойти и более интересно и правильно с точки зрения математики. Также в любом случае следует не забыть про граничные условия, то есть индекс, например, (i - 1) при i = 0 существовать не будет, но значение там быть должно - это зависит от стратегии, может быть всегда 0 - для образования мягкой рамки, а может быть значением ближайшего пикселя.
6) Сохранить результат в матрице q2 штатными средствами QImage.
Записан
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #13 : 25-01-2017 15:56 » 

вот алгоритм, по которому это должно работать. все посты выше об увеличении картинки и дальнейшем уменьшении-все не то.
http://s018.radikal.ru/i511/1701/82/5a4541d7de4e.jpg
вот пример: Слева-исходник, справа-то что должно получиться.

алгоритм:
1. Проходим (анализируем) по всей картинке, определяем основные цвета:
Серый (сер)
Красный (кр)
Синий (син)

2. Задаем основным цветам добавочные ассоциативные цвета:
Сер-> зелёный
Кр-> бордо
Син-> фиолетовый

3. Начинаем проход сверху вниз слева направо:
Сер? - Да! - запомнили
Сер?- да!- дальше ( повторяем)
Сер?- нет! Красный, заносим в эту ячейку добавочный цвет- бордо, и в предыдущую ячейку заносим дополнительный цвет- зелёный.
Идём дальше:
Следующая ячейка Серая ( опять поменялось)- значит туда зеленую, заносим в предыдущую (какая там была? Красная? Ок!) бордо туда!
Следующая опять серая? - начинай с начала цикла.


Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #14 : 25-01-2017 20:03 » 

Определились с языком?

Подыскали по нему литературу?

Скачали ПО?

Вот это: RGB = {127, 127, 127}; - серый.

Вот это: RGB = {167, 167, 167}; - тоже серый, но светлее.
Записан
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #15 : 25-01-2017 20:28 » 

Определились с языком?

Подыскали по нему литературу?

Скачали ПО?

Вот это: RGB = {127, 127, 127}; - серый.

Вот это: RGB = {167, 167, 167}; - тоже серый, но светлее.
ну я собственно потому и обратился на этот форум, чтобы дельным советом подсказали какой язык лучше использовать.
начал скачивать Qt-там столько много версий, причем по дефолту ставится совсем немного. Мжет кто подскажет что именно мне потребуется а что не потребуется.
и по поводу разных оттенков серого-я не понял ремарки. Ну разные, ну и что. если изначально вся картинка прогоняется на наличие различных цветов.
много цветов в конкретном случае не будет. максимум 10, ну 15 отсилы. в основном 3-5
Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #16 : 25-01-2017 20:49 » 

начал скачивать Qt-там столько много версий, причем по дефолту ставится совсем немного. Мжет кто подскажет что именно мне потребуется а что не потребуется.

и по поводу разных оттенков серого-я не понял ремарки. Ну разные, ну и что. если изначально вся картинка прогоняется на наличие различных цветов.
много цветов в конкретном случае не будет. максимум 10, ну 15 отсилы. в основном 3-5
1) Qt имеет онлайн инсталлятор, версия по умолчанию ставится последняя. По поводу компонентов сходу сказать сложно - перед глазами нет.

2) Ремарки по поводу того, что проработка математики должна быть более конкретной, ведь предстоит работать не с цветами, а с числами. В принципе, для точного описания алгоритма язык программирования не важен. Хотя до скачивания рекомендовал бы скачать учебник по "С/С++", чтобы оценить трудоёмкость его освоения, и если уж идти по пути получения профессиональных навыков, то идти осознанно.
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 26-01-2017 05:44 » 

Aether, абсолютно неважно, какой формат, мы говорит о пикселях. Подразумевается, что работаем, скажем, с RGB без всяких палитр

PapooAss, Qt - это не язык, это библиотека на языке C++. Ну а для самого алгоритма язык вообще неважен.

PapooAss, а вот по алгоритму - я понял, что хочется выделить границы цветовых областей. Но по скрину непонятно по правой стороне фигур - чойта там ничего не выделено ? Улыбаюсь

Предлагаю ещё такой алгоритм: попиксельно сканируется исходное изображение. Также предварительно есть заготовка для результата ( цвет заготовки неважен, там все пикселы закрасятся) - одинакового размера с исходником.  Для каждого пиксела исходника проверяется соседство (лево, верх, снизу, справа) и выбирается цвет пиксела и цвет соседнего пиксела для картинки результата (цвет как раз и выбирается в зависимости от перехода. Ну а переход для двух пикселов, само собой, определить несложно. Так же как и выбрать нужную замену цвета)

PS с ходу тут напрашивается оптимизация - проверять не 4 стороны пиксела, а только, скажем, справа и снизу
« Последнее редактирование: 26-01-2017 05:48 от Алексей++ » Записан

PapooAss
Интересующийся

ru
Offline Offline

« Ответ #18 : 26-01-2017 05:56 » 


PapooAss Но по скрину непонятно по правой стороне фигур - чойта там ничего не выделено ? Улыбаюсь

Все верно, проверка должна проходить ТОЛЬКО в одном направлении (столбцы либо строки).
Чтобы было понимание для чего это нужно-есть трикотажное производство с ЧПУ. необходимо задать программе команду на перестроение ниток. для этого и надо обозначить контрольные пикселы для выбора того или иного цвета ниток. Ну а если кто сталкивался с этой отраслью промышленности-там идет "ручейками" нитки.  Именно поэтому проверка только в одном направлении
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 26-01-2017 06:03 » 

PapooAss, вот и подошли к сути - написание ТЗ Улыбаюсь Оказывается, алгоритм вовсе не абстрактный, а очень даже завязан на механику реального процесса

Мой последний алгоритм вполне подходит с небольшими правками

Записан

Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #20 : 26-01-2017 11:12 » 

Да, ТЗ интересно было бы почитать, как и описание работы текстильного станка. Получается, нужно сделать для него управляющую программу - загружаем изображение, а программа строит план: где пойдёт какая основа, и где будет какая утка?
Записан
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #21 : 26-01-2017 15:11 » 

Активные поиски по просторам интернета натолкнули меня на редактор Paint.Net
Она бесплатная-это то, что надо да и к тому же есть возможность написания плагинов при помощи библиотеки CodeLab.
Тот же С#. Буду ковырять в этом направлении. Как сделаю-отпишусь. ))
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 27-01-2017 04:56 » 

PapooAss, так это всего лишь графический редактор, там программы не пишутся

вот ещё одна идея, как выделить граничные пикселы: если копию изображения сдвинуть на пиксел вниз и вычесть из исходника, то получаться не нулевые цвета там, где снизу переходы цветов. Такую же операцию нужно проделать со сдвигом на 1 пиксел вверх. Затем обе маски наложить на исходник

И - исходник
И1 - сдвиг на 1 вниз
И2 - сдвиг на 1 вверх
M1 = И - И1
M2 = И - И2
Р - результат
И  И1  И2     М1    М2     Р

       1
1  *   1      *     0      1
1  1   1      0     0      1
1  1   2      0    -1     -1    <--- переход
2  1   2      1     0      1    <--- переход
2  2   2      0     0      2
2  2   *      0     *      2
   2

« Последнее редактирование: 27-01-2017 05:03 от Алексей++ » Записан

PapooAss
Интересующийся

ru
Offline Offline

« Ответ #23 : 27-01-2017 08:59 » 

PapooAss, так это всего лишь графический редактор, там программы не пишутся

вот ещё одна идея, как выделить граничные пикселы: если копию изображения сдвинуть на пиксел вниз и вычесть из исходника, то получаться не нулевые цвета там, где снизу переходы цветов. Такую же операцию нужно проделать со сдвигом на 1 пиксел вверх. Затем обе маски наложить на исходник

И - исходник
И1 - сдвиг на 1 вниз
И2 - сдвиг на 1 вверх
M1 = И - И1
M2 = И - И2
Р - результат
И  И1  И2     М1    М2     Р

       1
1  *   1      *     0      1
1  1   1      0     0      1
1  1   2      0    -1     -1    <--- переход
2  1   2      1     0      1    <--- переход
2  2   2      0     0      2
2  2   *      0     *      2
   2
интересная идея, не спорю. но мне кажется сложновата.
1. цвет не передается одной цифрой. А значит придется мудрить постоянные проверки сразу как минимум по 3 составляющим, либо присваивать каждому цвету-свой номер. Хорошо если их 2. А если 10? Вот тут и возникает вопрос номер 2.
2. в данном примере 1 переход между цветами. а если будет "1112221211"-уже как минимум 4 перехода. Ок алгоритм отработает, мы получим в результате необходимые нам 1 и -1. Сравним с исходником, обнаружим переходы. Дальше что? как понять что за цвет должен быть в том или ином месте.
вот пример:
И  И1  И2     М1    М2     Р

       1
1  *   1      *     0      1
1  1   2      0     -1      -1    <--- переход
2  1   2      1       0     1    <--- переход
2  2   3      0     -1      -1    <--- переход
3  2   3      1      0      1    <--- переход
3  3   *      0     *      3
   3

В итоге, если мы присвоим каждому такому состоянию перехода свой цвет-то получится что ячейки с "2" будут иметь разные цвета на границе сверху и снизу! (выделены желтым). А они должны быть одинаковые
« Последнее редактирование: 27-01-2017 09:04 от PapooAss » Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #24 : 27-01-2017 10:49 » 

Как мини пример:
Код: (C)
#include <stdio.h>

#define WIDTH 5
#define HEIGHT 5

typedef struct {
    unsigned char cRed;
    unsigned char cGreen;
    unsigned char cBlue;
    unsigned char cAlpha;
} RGB;

int main(int argc, char* argv)
{
    static RGB ppsSrc[WIDTH][HEIGHT] = {
        {{127, 127, 127, 0}, {127, 127, 127, 0}, {127, 127, 127, 0}, {127, 127, 127, 0}, {0, 0, 0, 0}},
        {{127, 127, 127, 0}, {127, 127, 127, 0}, {127, 127, 127, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
        {{127, 127, 127, 0}, {127, 127, 127, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
        {{127, 127, 127, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}},
        {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}
        };

    static RGB ppsDst[WIDTH][HEIGHT];

// Обработка
    for (int iY = 0; iY < HEIGHT; iY++) {

        for (int iX = 0; iX < WIDTH; iX++) {

            char tcRed = ppsSrc[iX][iY].cRed;
            char tcGreen = ppsSrc[iX][iY].cGreen;
            char tcBlue = ppsSrc[iX][iY].cBlue;

            if (iX != WIDTH - 1) {

                char tcRed_next = ppsSrc[iX + 1][iY].cRed;
                char tcGreen_next = ppsSrc[iX + 1][iY].cGreen;
                char tcBlue_next = ppsSrc[iX + 1][iY].cBlue;

                if ((tcRed != tcRed_next) ||

                    (tcGreen != tcGreen_next) ||
                    (tcBlue != tcBlue_next)) {

                    ppsDst[iX][iY].cRed = (unsigned char)255;
                    ppsDst[iX][iY].cGreen = (unsigned char)255;
                    ppsDst[iX][iY].cBlue = (unsigned char)255;

                } else {

                    ppsDst[iX][iY].cRed = ppsSrc[iX][iY].cRed;
                    ppsDst[iX][iY].cGreen = ppsSrc[iX][iY].cGreen;
                    ppsDst[iX][iY].cBlue = ppsSrc[iX][iY].cBlue;

                }
            } else {

                ppsDst[iX][iY].cRed = ppsSrc[iX][iY].cRed;
                ppsDst[iX][iY].cGreen = ppsSrc[iX][iY].cGreen;
                ppsDst[iX][iY].cBlue = ppsSrc[iX][iY].cBlue;

            }
        }
    }

// Вывод исходного
    printf("\nSrc:\n");

    for (int iY = 0; iY < HEIGHT; iY++) {

        for (int iX = 0; iX < WIDTH; iX++) {

            printf("{%3u - %3u - %3u} ", ppsSrc[iX][iY].cRed,
                                         ppsSrc[iX][iY].cGreen,
                                         ppsSrc[iX][iY].cBlue);
        }
    printf("\n");
    }

// Вывод полученного
    printf("\nDst:\n");

    for (int iY = 0; iY < HEIGHT; iY++) {

        for (int iX = 0; iX < WIDTH; iX++) {

            printf("{%3u - %3u - %3u} ", ppsDst[iX][iY].cRed,
                                         ppsDst[iX][iY].cGreen,
                                         ppsDst[iX][iY].cBlue);
        }
    printf("\n");
    }

return 0;
}

Результат:
Src:
{127 - 127 - 127} {127 - 127 - 127} {127 - 127 - 127} {127 - 127 - 127} {  0 -   0 -   0}
{127 - 127 - 127} {127 - 127 - 127} {127 - 127 - 127} {  0 -   0 -   0} {  0 -   0 -   0}
{127 - 127 - 127} {127 - 127 - 127} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}
{127 - 127 - 127} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}
{  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}

Dst:
{127 - 127 - 127} {127 - 127 - 127} {127 - 127 - 127} {255 - 255 - 255} {  0 -   0 -   0}
{127 - 127 - 127} {127 - 127 - 127} {255 - 255 - 255} {  0 -   0 -   0} {  0 -   0 -   0}
{127 - 127 - 127} {255 - 255 - 255} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}
{255 - 255 - 255} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}
{  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0} {  0 -   0 -   0}

Алексей++, если сдвинуть изображение на 1 пиксель вправо и перемножить с оригиналом, то этого ему будет достаточно, но тогда грани объектов будут выделены с обеих сторон, а ему, как понял, нужно только с фронта. Вообще, нужно подробное ТЗ, чётко сформулированное - обычно его грамотное составление - это уже решение задачи на половину.
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 28-01-2017 12:06 » 

PapooAss, цвет в RGB - это всегда одна цифра, тут всё нормально. Я лишь показываю, как переходы можно обнаружить - довольно несложно. А вот что дальше с этой информацией делать нужно придумать, как их там правильно раскрасить. Я сам техпроцесс пока что не представляю, поэтому дальше и не предлагаю ничего
« Последнее редактирование: 28-01-2017 13:24 от Алексей++ » Записан

PapooAss
Интересующийся

ru
Offline Offline

« Ответ #26 : 28-01-2017 22:07 » 

В общем задача такова:
Необходимо в местах перехода цветов с обоих границ поменять цвета на любые другие, не важно на какие, лишь бы они не совпадали с уже имеющимися.
При этом проверка должна осуществляться только по столбцам. Смена границ в строках-не имеет значения.
Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #27 : 29-01-2017 08:34 » 

В общем задача такова:
Необходимо в местах перехода цветов с обоих границ поменять цвета на любые другие, не важно на какие, лишь бы они не совпадали с уже имеющимися.

При этом проверка должна осуществляться только по столбцам. Смена границ в строках-не имеет значения.
Уже привели такие идеи, дело за конкретикой и реализацией. Ваша задача описать желаемое, начать разработку, а участники по мере наличия сил и желания попробуют поспособствовать реализации.

Вот как, например, обеспечить так, чтобы цвета не совпадали? Это либо создание карты исходных цветов, с чётко оговорёнными параметрами, либо переход от BMP, который тут особо и не нужен к матрицам увеличенной разрядности. Возможно проще реализовать отдельную матрицу границ?
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 29-01-2017 08:57 » 

PapooAss, можно сначала определить все использующиеся цвета, выделить 2 новых (неиспользованных) цвета для обозначения переходов. Их и использовать
Записан

PapooAss
Интересующийся

ru
Offline Offline

« Ответ #29 : 02-02-2017 13:52 » 

Задачу решил.
Как и задумывал-в виде плагина к программе Paint.Net.
Если кому интересно-могу выложить готовый плагин.
Всем большое спасибо за участие и идеи. Отличный форум. Пожалуй пропишусь тут ))
Записан
Aether
Молодой специалист

ru
Online Online
Пол: Мужской

« Ответ #30 : 02-02-2017 15:45 » 

Готовый плагин не так интересен, как его внутренняя реализация. Впрочем, Вы бы могли представить результат его работы на примере изображения из рабочего задания: картинка до, картинка после.
Записан
PapooAss
Интересующийся

ru
Offline Offline

« Ответ #31 : 02-02-2017 18:40 » 

Готовый плагин не так интересен, как его внутренняя реализация. Впрочем, Вы бы могли представить результат его работы на примере изображения из рабочего задания: картинка до, картинка после.
Я предложил готовый плагин лишь потому, что в теме участвовали люди, которые программируют на С/С++ и др. языках в полноценном смысле. одним словом-знающие.
А модуль CodeLab, собственно на чем и была реализована задача, никто даже не упомянул.
Тем не менее я готов поделиться, может кому пригодится...

Код:
// Name: Edge 4.0
// Submenu: Advanced
// Author: PapooAss
// Title: Edge 4.0
// Version: 4.0
// Desc:
// Keywords:
// URL:
// Help:
#region UICode
IntSliderControl Amount1 = 0; // [-100,100] Голубой-Красный
IntSliderControl Amount2 = 0; // [-100,100] Пурпурный-Зеленый
IntSliderControl Amount3 = 0; // [-100,100] Желтый-Синий
#endregion

private byte Clamp2Byte(int iValue) //процедура , которая возвращает "0" если получается отрицательное значение переменной и "255" если больше 255
{
    if (iValue<0) return 0;
    if (iValue>255) return 255;
    return (byte)iValue;
}//взята из Урока
    
    
void Render(Surface dst, Surface src, Rectangle rect)
{
    ColorBgra CurrentPixel;
    ColorBgra VerifyPixel;
    int R,G,B;
    int Rv, Gv, Bv;
    
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        if (IsCancelRequested) return;
        for (int x = rect.Left; x < (rect.Right - 1); x++) //стандартный перебор -1 по координатам Х
        {
            CurrentPixel = src[x,y]; //присвоили переменной CurrentPixel текущий пиксель [x,y]
            VerifyPixel = src[(x+1),y]; //присвоили переменной VerifyPixel текущий пиксель [x+1,y]
           if (CurrentPixel.Bgra != VerifyPixel.Bgra) //сравниваем эти переменные. (!=)-означает НЕ равно
           {
               // сдвиг гаммы цвета основного пикселя
               R = (int)CurrentPixel.R;
               G = (int)CurrentPixel.G;
               B = (int)CurrentPixel.B;
              
               R = R + Amount1;
               G = G -(Amount1 / 2);
               B = B -(Amount1 / 2);
              
               G = G + Amount2;
               R = R - (Amount2 / 2);
               B = B - (Amount2 / 2);
              
               B = B + Amount3;
               R = R - (Amount3 / 2);
               G = G - (Amount3 / 2);
              
               // сдвиг гаммы цвета вспомогательного пикселя
               Rv = (int)VerifyPixel.R;
               Gv = (int)VerifyPixel.G;
               Bv = (int)VerifyPixel.B;
              
               Rv = Rv + Amount1;
               Gv = Gv -(Amount1 / 2);
               Bv = Bv -(Amount1 / 2);
              
               Gv = Gv + Amount2;
               Rv = Rv - (Amount2 / 2);
               Bv = Bv - (Amount2 / 2);
              
               Bv = Bv + Amount3;
               Rv = Rv - (Amount3 / 2);
               Gv = Gv - (Amount3 / 2);
              
               // Собираем цвет заново по каналам  R, G, and B с привлечением процедуры Clamp2Byte
                CurrentPixel = ColorBgra.FromBgra(Clamp2Byte(B),Clamp2Byte(G),Clamp2Byte(R),CurrentPixel.A);
                VerifyPixel = ColorBgra.FromBgra(Clamp2Byte(Bv),Clamp2Byte(Gv),Clamp2Byte(Rv),CurrentPixel.A);
           dst[x,y] = CurrentPixel; //Записали собранный пиксель по координатам [x,y]
           dst[(x+1),y] = VerifyPixel; //записали собранный пиксель по координатам [x+1,y]
           }
         }
    }
}

Картинка ДО



Картинка ПОСЛЕ

« Последнее редактирование: 02-02-2017 19:39 от PapooAss » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #32 : 03-02-2017 05:07 » 

PapooAss, мануал по созданию плагина к Paint.Net в студию, вдруг пригодится Отлично
Записан

PapooAss
Интересующийся

ru
Offline Offline

« Ответ #33 : 03-02-2017 06:39 » 

PapooAss, мануал по созданию плагина к Paint.Net в студию, вдруг пригодится Отлично
О! Этому посвящена целая ветка форума! http://paint-net.ru/forum/viewforum.php?f=5&sid=8ead4024d9b6a0d5c47d388ee1cb927d

Ну и чтобы долго там не искать-вот ссыль на скачивание мануала на русском:
https://cloud.mail.ru/public/93mz/fK4bPApHj
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #34 : 04-02-2017 07:44 » 

PapooAss, спасибо, на досуге полистаю форум.

Вторая ссылка бесполезная, там явно не хватает файлов )
Записан

Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines