Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Результат с вычитания двух изображений

57K
21 сентября 2010 года
roma_lir
10 / / 13.06.2010
Есть два изображения (изначально бинарные, имеют одинаковые ширину и высоту). Ищу их разницу тупо в лоб (беру каждый пиксель):
 
Код:
var i,j:integer;
begin
      for i:=0 to image1.Picture.Width do
         for j:=0 to image1.Picture.Height do
         begin
             if image1.Canvas.Pixels[i,j]=image2.Canvas.Pixels[i,j]
             then image3.Canvas.Pixels[i,j]:=clwhite
             else image3.Canvas.Pixels[i,j]:=clblack
         end;
end;

И получаю: скриншот 1.jpg

Этот процесс идет секунды 2-3.
Вопрос: Можно как-то ускорить этот процесс? Или использовать что-то другое для достижения такого же результата.

Спасибо
5
21 сентября 2010 года
hardcase
4.5K / / 09.08.2005
1) Не пользоваться Pixels (кажется начинаю повторяться) в пользу ScanLine
2) Использовать BitBlt с параметром PATINVERT.
399
21 сентября 2010 года
KIV
432 / / 20.01.2009
Не пользоваться Canvas. Обращение к Pixels каждый раз приводит к вызову GetPixel. В цикле это очень долго. Я бы создал двумерный массив TColor и работал с ним.
5
21 сентября 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: KIV
Я бы создал двумерный массив TColor и работал с ним.

Зачем, если есть ScanLine?

57K
22 сентября 2010 года
roma_lir
10 / / 13.06.2010
ок... Спасибо. Буду работать
57K
22 сентября 2010 года
roma_lir
10 / / 13.06.2010
Мда... Я понял - что я ничего не понял. Если можно направьте куда нужно рыть по изучению Bitmap и работы с изображением в памяти. Или с чего начать? Смотрел структуру BMP, указатели, и дальше не знаю(можно направлять любыми методами).
303
22 сентября 2010 года
makbeth
1.0K / / 25.11.2004
Цитата: roma_lir
Мда... Я понял - что я ничего не понял. Если можно направьте куда нужно рыть по изучению Bitmap и работы с изображением в памяти. Или с чего начать? Смотрел структуру BMP, указатели, и дальше не знаю(можно направлять любыми методами).


Поиск, батенька, поиск как всегда рулит ;)
В частности, я об этом писал. Ну еще куча других тем по поисковому запросу Scanline.

57K
22 сентября 2010 года
roma_lir
10 / / 13.06.2010
Цитата:
В частности, я об этом писал. Ну еще куча других тем по поисковому запросу Scanline.


Правильно ли я понимаю: если для PixelFormat значение pf1bit то

 
Код:
var line: PByteArray;
begin
    line := Bitmap1.Scanline[0];
    {Задаем первому пикселю черный цвет}
    line[0]:=0;
    {Задаем второму пикселю белый цвет}
    line[1]:=1;
    ...
end;
247
23 сентября 2010 года
wanja
1.2K / / 03.02.2003
Если pf1bit, то нет. В элементе массива номер 0 - 8 пикселей (каждый по биту).
57K
23 сентября 2010 года
roma_lir
10 / / 13.06.2010
Я чуть разобрался. У меня получилось. Всем спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог