Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: 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 вся ветка

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
7-44928
_Andy
2003-04-29 13:08
2003.07.14
Частота монитора


9-44539
Аболтус
2003-01-25 21:22
2003.07.14
Народ помогите новичку плиз!!!!


4-44946
DeadMeat
2003-05-11 21:55
2003.07.14
Доступ к памяти процесса


1-44643
Lana
2003-07-02 11:12
2003.07.14
Radiogroup в выпадающем списке


3-44557
st-av
2003-06-19 18:43
2003.07.14
Имя таблицы как параметр хранимойпроцедуры