Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как правильно и быстро просканировать пиксели [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. А вообще - зачем это?...


Наверх

Титульная страница Поиск, карта сайта Написать письмо