Вниз
Скачать: CL | DM;

Как БЫСТРО проверить, чист ли Canvas?   Найти похожие ветки 

 
oleg_SYS ©   (2003-06-28 21:46) [0]

У меня такая проблема: мне нужно проверить большое число BitMap`ов, среди которых может оказаться простое одноцветное избражение. Я сделал неплохой цикл, который проверяет изображение попиксельно. Причём, цикл остановится на том моменте, когда заметит "посторонний" пиксел.

for b:=1 to bm.height do
begin
for a:=1 to bm.Width do
begin
if bm.Canvas.Pixels[0,0]<>bm.Canvas.Pixels[a-1,b-1]
then begin d:=True; Exit; end;
end;
end;

Т.е., если d=False, то изображение однотонное.
Но это медленный способ. Никто не знает что-то побыстрее? (кроме assembler`а :)
Спасибо...


 
Fenik ©   (2003-06-28 22:00) [1]

Вот побыстрее.
Если возвращает True, то рисунок одноцветный.

function OneColorOnBitmap(Bitmap: TBitmap): Boolean;
type
TRGB = record
B, G, R: Byte;
end;
pRGB = ^TRGB;
var x, y: Integer;
Dest: pRGB;
C: TRGB;
begin
Result := True;
C.R := Lo(Bitmap.Canvas.Pixels[0, 0]);
C.G := Lo(Bitmap.Canvas.Pixels[0, 0] shr 8);
C.B := Lo((Lo(Bitmap.Canvas.Pixels[0, 0]); shr 8) shr 8);
for y := 0 to Bitmap.Height - 1 do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
with Dest^ do
if (B <> C.B) or (G <> C.G) or (R <> C.R) then begin
Result := False;
Break;
end;
Inc(Dest);
end;
end;
end;


 
oleg_SYS ©   (2003-06-28 22:15) [2]

Спасибо! ScanLine работает намного быстрее. Может, существует ещё какой-то способ?


 
Fenik ©   (2003-06-28 22:19) [3]

Читай здес:
http://www.delphimaster.ru/articles/pixels/index.html


 
oleg_SYS ©   (2003-06-28 23:01) [4]

Fenik, у меня почему-то твоя функция не работает. Она всегда возвращает значение False :(


 
Fenik ©   (2003-06-29 00:24) [5]

Вставь
Bitmap.PixelFormat := pf24Bit;


 
oleg_SYS ©   (2003-06-29 12:14) [6]

Fenik, всё-равно не работает :(


 
Fenik ©   (2003-06-29 12:39) [7]

Да, моя ошибка.

Вот. Исправь условие на это:

if (B <> C.B) and (G <> C.G) and (R <> C.R) then begin
Result := False;
Exit;
end;


 
oleg_SYS ©   (2003-06-30 17:27) [8]

Fenik, теперь работает. Спасибо! Скорость меня устраивает :)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.015 c
14-44800
GrEG
2003-06-26 08:18
2003.07.14
Ресурсы


3-44598
ruslan_as
2003-06-21 11:13
2003.07.14
Структура базы InterBase


4-44949
firefox
2003-05-10 17:34
2003.07.14
Как сменить иконку у файла


3-44561
RDA
2003-06-19 19:59
2003.07.14
Использование DBLookUpCombobox


7-44930
Renegate
2003-05-05 09:26
2003.07.14
Считывание и запись данных паралельного порта.




   Наверх