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

Ваш аккаунт

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

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

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

Как быстро на Дельфи вычитать картинки?

8.4K
04 декабря 2004 года
Martin114
4 / / 14.10.2004
Задача: вычесть по цвету одну картинку из другой. Исходная картинка:
8.4K
04 декабря 2004 года
Martin114
4 / / 14.10.2004
Из нее нужно вычесть такую картинку:
8.4K
04 декабря 2004 года
Martin114
4 / / 14.10.2004
...и получить светлую полосу. Вот как это делается по-простому:
for j := Image1.Picture.Bitmap.Canvas.ClipRect.Top to Image1.Picture.Bitmap.Canvas.ClipRect.Bottom-1 do
begin
for i := Image1.Picture.Bitmap.Canvas.ClipRect.Left to Image1.Picture.Bitmap.Canvas.ClipRect.Right-1 do
begin
Image3.Picture.Bitmap.Canvas.Pixels[i,j]:=
Image2.Picture.Bitmap.Canvas.Pixels[i,j]-
Image1.Picture.Bitmap.Canvas.Pixels[i,j];
end;
end;
Но очень тормозит. Нужно, чтобы работало быстрее. Есть вариант сделать через ScanLine, но нужно уметь работать с палитрой.
1.7K
15 декабря 2004 года
Envel
206 / / 29.11.2004
Цитата:
Originally posted by Martin114
...и получить светлую полосу. Вот как это делается по-простому:
for j := Image1.Picture.Bitmap.Canvas.ClipRect.Top to Image1.Picture.Bitmap.Canvas.ClipRect.Bottom-1 do
begin
for i := Image1.Picture.Bitmap.Canvas.ClipRect.Left to Image1.Picture.Bitmap.Canvas.ClipRect.Right-1 do
begin
Image3.Picture.Bitmap.Canvas.Pixels[i,j]:=
Image2.Picture.Bitmap.Canvas.Pixels[i,j]-
Image1.Picture.Bitmap.Canvas.Pixels[i,j];
end;
end;
Но очень тормозит. Нужно, чтобы работало быстрее. Есть вариант сделать через ScanLine, но нужно уметь работать с палитрой.


Я не шарю в delphi, но думаю, что можно обойтись простым BitBlt (WINAPI) из памяти в память, указав правильный метод наложения (отличный от SRCCOPY).

487
24 декабря 2004 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Martin114
...и получить светлую полосу. Вот как это делается по-простому:
for j := Image1.Picture.Bitmap.Canvas.ClipRect.Top to Image1.Picture.Bitmap.Canvas.ClipRect.Bottom-1 do
begin
for i := Image1.Picture.Bitmap.Canvas.ClipRect.Left to Image1.Picture.Bitmap.Canvas.ClipRect.Right-1 do
begin
Image3.Picture.Bitmap.Canvas.Pixels[i,j]:=
Image2.Picture.Bitmap.Canvas.Pixels[i,j]-
Image1.Picture.Bitmap.Canvas.Pixels[i,j];
end;
end;
Но очень тормозит. Нужно, чтобы работало быстрее. Есть вариант сделать через ScanLine, но нужно уметь работать с палитрой.



Попробуй так:

 
Код:
Image3.Picture.Bitmap.Canvas.Draw(0,0,Image1.Picture.Bitmap);
Image3.Picture.Bitmap.Canvas.CopyMode:=cmNotSrcCopy;
Image3.Picture.Bitmap.Canvas.CopyRect(Rect(0,0,Image3.Picture.Bitmap.Width,Image3.Picture.Bitmap.Height),Image2.Picture.Bitmap.Canvas,
Rect(0,0,Image3.Picture.Bitmap.Width,Image3.Picture.Bitmap.Height));


За корректность синтаксиса не уверен - давно уже с Дельфями не возился. Но думаю разберешься.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог