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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2014, 19:45   #1
XMalon
 
Регистрация: 03.03.2010
Сообщений: 3
По умолчанию обработка изображения (BitBlt)

Задача:
Есть два изображения одинаковой размерности - B1: TBitmap, B2: TBitmap. Необходимо получить изображение B3: TBitmap в котором:
Код:
I = 1..B1.Height
J = 1..B1.Width
if B1.Canvas.Pixels[I, J].Color = B2.Canvas.Pixels[I, J].Color
  then B3.Canvas.Pixels[I, J].Color := clBlack
  else B3.Canvas.Pixels[I, J].Color := B2.Canvas.Pixels[I, J].Color
(в котором на черном фоне отображаются только те пиксели изображения B2, которые на по цвету не равны соответствующим пикселям изображения B1)

Через доступ к пикселям (Canvas.Pixels[I, J].Color) я эту задачу решил. А вот с помощью функции BitBlt не получается. Хотя я думаю это возможно. Ведь если вызвать:
Код:
BitBlt(B3.Canvas.Handle, 0, 0, B2.Width, B2.Height, B2.Canvas.Handle, 0, 0, SRCCOPY)
BitBlt(B3.Canvas.Handle, 0, 0, B1.Width, B1.Height, B1.Canvas.Handle, 0, 0, SRCERASE)
то в B2 получится практически маска, по которой нужно обрезать B2. Но не пойму как...

Последний раз редактировалось Stilet; 07.10.2014 в 20:45.
XMalon вне форума Ответить с цитированием
Старый 07.10.2014, 20:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но не пойму как...
А так как ты написал не катит? О_о
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2014, 22:17   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

I и J перепутаны местами (параметры Pixels - ширина, потом высота), ошибка не проявилась скорее всего из-за квадратных картинок.
Я бы не стал возиться с битблитом, хотя немаловероятно, что через него (манипулируя режимами) можно решить задачу, я бы сделал через TBitmap.ScanLine - скорость высокая, поищите по форуму темы с его использованием.
Сканлайн по идее должен выиграть просто потому, что блитов надо будет 2 и/или более, и это несколько раз прогонять все пиксели (пусть и оптимизировано в кишках винды), а тут Вы точно знаете, что прогон один.
phomm вне форума Ответить с цитированием
Старый 08.10.2014, 07:46   #4
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

phomm посоветовал Вам правильный и быстрый вариант решения - scanline. C помощью тернарных растровых операций можно сделать так, как Вы хотите, но вам как ни крути понадобится маска. А для создания маски есть два пути : а) Paint, Paint.NET, Corel Draw, PhotoShop, etc ; б) опять же либо pixels[i,j] , либо scanline. То есть либо Вы будете постоянно для новой картинки, чтобы создать маску, открывать растровый редактор, либо ваша программа сама будет делать это за вас.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка изображения Chester751 Мультимедиа в Delphi 1 12.04.2013 23:19
обработка и преобразование изображения midiss C++ Builder 0 04.06.2012 14:52
обработка изображения в потоке Dеlphi Общие вопросы Delphi 8 04.03.2011 22:01
BitBlt, вывод изображения zotox Win Api 5 22.04.2010 21:43
Обработка изображения Hollander Мультимедиа в Delphi 6 10.03.2008 14:21