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.
Вопрос: Можно как-то ускорить этот процесс? Или использовать что-то другое для достижения такого же результата.
Спасибо
1) Не пользоваться Pixels (кажется начинаю
Не пользоваться Canvas. Обращение к Pixels каждый раз приводит к вызову GetPixel. В цикле это очень долго. Я бы создал двумерный массив TColor и работал с ним.
Цитата: KIV
Я бы создал двумерный массив TColor и работал с ним.
Зачем, если есть ScanLine?
ок... Спасибо. Буду работать
Мда... Я понял - что я ничего не понял. Если можно направьте куда нужно рыть по изучению Bitmap и работы с изображением в памяти. Или с чего начать? Смотрел структуру BMP, указатели, и дальше не знаю(можно направлять любыми методами).
Цитата: roma_lir
Мда... Я понял - что я ничего не понял. Если можно направьте куда нужно рыть по изучению Bitmap и работы с изображением в памяти. Или с чего начать? Смотрел структуру BMP, указатели, и дальше не знаю(можно направлять любыми методами).
Поиск, батенька, поиск как всегда рулит ;)
В частности, я об этом писал. Ну еще куча других тем по поисковому запросу Scanline.
Цитата:
В частности, я об этом писал. Ну еще куча других тем по поисковому запросу Scanline.
Правильно ли я понимаю: если для PixelFormat значение pf1bit то
Код:
var line: PByteArray;
begin
line := Bitmap1.Scanline[0];
{Задаем первому пикселю черный цвет}
line[0]:=0;
{Задаем второму пикселю белый цвет}
line[1]:=1;
...
end;
begin
line := Bitmap1.Scanline[0];
{Задаем первому пикселю черный цвет}
line[0]:=0;
{Задаем второму пикселю белый цвет}
line[1]:=1;
...
end;
Если pf1bit, то нет. В элементе массива номер 0 - 8 пикселей (каждый по биту).
Я чуть разобрался. У меня получилось. Всем спасибо!