Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2009, 14:56   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Нужны любые идеи как создать фильтр Color blindness для bitmap!

Добрый день!

Нужны любые идеи как создать фильтр Color blindness для bitmap наподобие приложенного рисунка. Ниже приведен тестовый вариант подобного решения, но он не работает корректно и нет действительного рисунка Color blindness:
Код:
procedure TMainForm.ColorBlind(SrcBmp, DestBmp: TBitmap; Size: Integer);
const BackColors: array [0..4] of TColor =
  ($001954B1, $006692D1, $0094ACEE, $0096B3E6, $00BDDBFF);
const FrontColors: array [0..4] of TColor =
  ($005C815F, $0094AD91, $00ABD5BC, $00DDFFCA, $00C3E9E9);
var SrcRow: pByteArray;
    X, Y, Z, S: Integer;
begin
  DestBmp.Width := SrcBmp.Width;
  DestBmp.Height := SrcBmp.Height;
  SrcBmp.PixelFormat := pf24Bit;
  DestBmp.PixelFormat := pf24Bit;
  Inc(Size);
  DestBmp.Canvas.Pen.Style := psClear;
  DestBmp.Canvas.Brush.Style := bsSolid;
  ProgressBar1.Max := SrcBmp.Height;
  for Y := 0 to SrcBmp.Height - 1 do begin
    SrcRow := SrcBmp.ScanLine[Y];
    for X := 0 to SrcBmp.Width - 1 do begin
      Z := Random(5);
      S := Random(Size);
      if (SrcRow[X*3] <> 0) and (Random < 0.77)
        then DestBmp.Canvas.Brush.Color := BackColors[Z]
        else DestBmp.Canvas.Brush.Color := FrontColors[Z];
      DestBmp.Canvas.Ellipse(X - S, Y - S, X + S, Y + S);
    end;
    ProgressBar1.Position := Y;
  end;
end;
Спасибо за любую помощь!
Изображения
Тип файла: jpg Ishihara_9.jpg (72.9 Кб, 185 просмотров)

Последний раз редактировалось rpy3uH; 05.04.2009 в 17:50.
SkAndrew вне форума Ответить с цитированием
Старый 04.04.2009, 17:00   #2
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

я чот не пойму.. вам нада определить пару наиболее часто встречающихся цветов и на итоговый рисунок вывести тока их, а остальные просто удалить.. или что?? можна вопрос немного по конкретнее сделать?? или у вас есть какойто текст и нада на него чтото наложить..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 04.04.2009, 17:24   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за дискуссию, мне необходимо например число любое или слово вывести на битмап так как это показано в прилагаемом к этому сообщению рисунку. смотрите аттач, пожалуйста. спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 04.04.2009, 18:09   #4
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

в прилагаемом вами коде оно рисует круг заданого радиуса С КАЖДОЙ точки исходного битмапа.. от того код работает не корректно.. тут нужно в корне менять алгоритм.. я вижу его приблизительно таким:
1) определить какую нибуть точку надписи (назовем ее первой точкой.. потому что с нее будем отталкиваться дальше..)
2) оприделить растояние от єтой точки до ближайшей гриницы надписи (это будет радиус круга) и проверить чтобы в даной зоне небыло других кружков..
3) нарисовать кржок
3) определить следующюю точку на тексте.. и дальше п1 - 3..

и тоже самое нада проделать и для фона..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 04.04.2009, 18:23   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за дискуссию. Может кто-то может более конкретнее подсказать решение задачи - небольшим примером. Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 04.04.2009, 19:47   #6
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
Радость

Есть идея!
Вообразим сетку с шагом, например, 30 пикселей. Теперь в цикле пробегаем по этой сетки и рандомно выбираем радиус окружности с центром в узле сетки, но он(радиус) не больше шага сетки, не меньше константы, и не врезается в другие круги!Заносим данный в массив.Пробегаемся по этому массиву и определяем средний цвет! Очищаем изображение и отрисовываем круги с заданными радиусами и цветом!
Levsha100 вне форума Ответить с цитированием
Старый 04.04.2009, 19:57   #7
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

полседняя идея по-моему очень интересная, могу попросить Вас привести пример, пусть не совсем рабочий. я врач и мне необходим этот алгоритм для работы. на примере мне будет проще доработать его. Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 04.04.2009, 20:02   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

На подобии придыдущего поста. Черным по белому большими буквами пишите то что надо через любые api, тот же примитивный TextOutW. Потом сканируите с нужным шагом (сетки) и создаете соотвественно двумерный массив типа 0 до 1. Т.е. интенсивность цвета (если надо именно так как на картинке). Далее чистите этот HDC (ну или в простонародии TCanvas) и прогоняя ваш полученный массив относительно интенсивности, т.е. как бы коэфицеента, выводите нужный цвет то что надо, к примеру кружки.
Уточнил просто. Писать пример, слижком уж трудоемко, время терять, может кто-то и напишет.
BOBAH13 вне форума Ответить с цитированием
Старый 04.04.2009, 20:26   #9
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за идею, может у кого-то найдется небольшой пример, хотя бы схематично. спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 05.04.2009, 09:12   #10
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за идеи, но мне совершенно непонятна фраза из предыдущего сообщения "потом сканируите с нужным шагом (сетки) и создаете соотвественно двумерный массив типа 0 до 1.". может все же приведете пусть даже неработающий, но "живой" пример о чем идет речь. Спасибо.
SkAndrew вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать фильтр в ShellListView? LeoN Компоненты Delphi 5 05.07.2010 09:11
Файл и много картинок в нём. Нужны идеи Аццкий прогер Мультимедиа в Delphi 5 17.03.2009 14:09
как сделать фильтр для списка combobox ? sergey113 Помощь студентам 2 13.08.2008 16:29
Интересная задача. Нужны идеи ее решения KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 11 05.03.2008 18:43
Как построить Bitmap для jpeg файла ??? Kocapb Общие вопросы C/C++ 4 14.12.2007 19:50