![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как правильно и быстро просканировать пиксели [D7, WinXP]
Electric © (2005-12-07 13:32:00)задача: есть картинка размером 320х240 точек. есть массив из "0" и "1", нужно просканировать каждую точку картинки и если точка имеет цвет clBlack то в массив в соответствии с позицией просканированной точки нужно записать "1". попробовал сделать так:
var
DecodedText: String;
PixelColor: TColor;
PixX, PixY: Integer;
hLCD: HDC;
begin
PixX:=0;
PixY:=0;
hLCD:=PaintBox1.Canvas.Handle;
repeat
for PixX:=0 to 320 do
begin
PixelColor:=GetPixel(hLCD,PixX,PixY);
if PixelColor=clBlack then DecodedText:=DecodedText+'1'
else DecodedText:=DecodedText+'0';
end;
PixY:=PixY+1;
until PixY=240;
Memo1.Lines.Text:=DecodedText;
результат получил, но очень долго всё это происходит. Как можно ускорить процесс?
Electric (2005-12-07 15:36:00) [1]Большое спасибо, буду пробовать.
k2 (2005-12-07 14:26:00) [2]а ещё статья здесь есть http://www.delphimaster.ru/articles/pixels/index.html
Rem (2005-12-07 13:53:00) [3]Не мудрено, что медленно...
if PixelColor=clBlack then DecodedText:=DecodedText+'1'
else DecodedText:=DecodedText+'0';
Из старых запасников:
procedure TViewForm.ApplyContrast;
var
Val: byte;
SrcBMP: TBitmap;
DestBMP: TBitmap;
SrcLn: PRGBArray;
DestLn: PByteArray;
x: integer;
y: integer;
begin
SrcBMP := SrcImage.Picture.Bitmap;
DestBMP := BWImage.Picture.Bitmap;
for y := 0 to SrcBMP.Height - 1 do
begin
SrcLn := SrcBMP.ScanLine[y];
DestLn := DestBMP.ScanLine[y];
{$RANGECHECKS OFF}
for x := 0 to SrcBMP.Width - 1 do
begin
Val := (SrcLn^[x].R + SrcLn^[x].G + SrcLn^[x].B) div 3;
DestLn^[x] := byte(Val < m_iContrast);
end;
{$RANGECHECKS ON}
end;
end;
File-Open (2005-12-07 13:35:00) [4]есть картинка размером 320х240
В каком формате?
P.S. А вообще - зачем это?...