Конференция "Media" » максимально быстро считать цвет пикселя с экрана [D7, WinXP]
 
  • Azat (18.07.08 10:23) [0]
    Вопрос как максимально быстро считать цвет пикселя с экрана;
    делал я примерно так:
    BitBlt(Bitmap.Canvas.Handle, 0, 0,1024, 768, GetDC(0), 0, 0, SRCCOPY);
    p:=bitmap.Canvas.Pixels[200,200];

    Заранее спасибо.
  • han_malign © (18.07.08 11:42) [1]
    GetPixel?
  • v (18.07.08 13:07) [2]
    1) почему бы не блитить только один нужный пиксел в битмап 1х1?
    2) после GetDC хорошо бы сделать ReleaseDC
    3) если у битмапа формат pf32bit, то значение пиксела из битмапа можно брать напрямую через  ScanLine, ток нужно будет поменять порядок с BGR на RGB. Прямой доступ быстрее чем Canvas.Pixels.

    bmp := TBitmap.Create;
    bmp.Width := 1; bmp.Height := 1; bmp.PixelFormat := pf32bit;

    ...
    var c: TColor; dc: cardinal; p: TPoint;
    begin
     GetCursorPos(p);
     dc := GetDC(0);
     BitBlt(bmp.Canvas.Handle,0,0,1,1,dc,p.x,p.y,SRCCOPY);
     releasedc(0,dc);
     c := pinteger(bmp.Scanline[0])^;
     c := ((c and $FF) shl 16) or (c and $FF00) or ((c shr 16) and $FF);
     <делаем с цветом "с" че хотим>
    end;
  • v (18.07.08 13:18) [3]
    ой, забыл добавить, - в этом примере сдирается цвет пиксела под курсором
  • v (18.07.08 13:58) [4]
    елки-палки, когда же я проснусь ;-) конечно GetPixel. прошу прощения. ток про ReleaseDC не забываем...
  • Омлет (18.07.08 14:49) [5]
    > Вопрос как максимально быстро считать цвет пикселя с экрана;

    Если нужно только один пиксель, то лучше не использовать BitBlt, а делать сразу GetPixel c дескриптора экрана.

    > v   (18.07.08 13:07) [2]
    > 3) если у битмапа формат pf32bit, то значение пиксела из битмапа можно брать напрямую через  ScanLine

    При любом формате лучше юзать ScanLine. А еще лучше http://www.delphimaster.ru/articles/pixels/index.html
 
Конференция "Media" » максимально быстро считать цвет пикселя с экрана [D7, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0]