Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Считывание пикселя


Автор: welt 15.4.2011, 13:22
Есть такая потребность сделать аналог GetPixel, но более быстрый.
Вот какой код получился после поиска в интеренете. Где-то выкладывали на с++.
Но эта функция и GetPixel выдают разные значения.
В чем может быть причина?

Код

function MyGetPixel(hGame:HWND; x,y:integer):COLORREF;
const
    BITS_IN_BYTE = 8;
    GR_MODE_BYTES = 4;
    GR_MODE_BITS = GR_MODE_BYTES * BITS_IN_BYTE;

var
pixel:COLORREF;
BMI:TBITMAPINFO;
hGDC    : HDC;
Bitp    : integer;
hTmpDC  : HDC ;
hTmpBmp : HBITMAP;
TMP     : Integer;

begin
//        BMI:=0;
        hGDC:=GetDC(hGame);
        Bitp:=GetDeviceCaps(hGDC, BITSPIXEL);
        hTmpDC:=CreateCompatibleDC(hGDC);
        hTmpBmp:=CreateCompatibleBitmap(hGDC,1,1);

        SelectObject(hTmpDC,hTmpBmp);
        BitBlt(hTmpDC,0,0,1,1,hGDC,x,y,SRCCOPY);
        BMI.bmiHeader.biSize := sizeof(BMI.bmiHeader);
        BMI.bmiHeader.biWidth := 1;
        BMI.bmiHeader.biHeight := 1;
        BMI.bmiHeader.biPlanes := 1;
        BMI.bmiHeader.biBitCount := Bitp; //GR_MODE_BITS;
        BMI.bmiHeader.biCompression := BI_RGB;
        BMI.bmiHeader.biSizeImage:=Bitp div 8; //{GR_MODE_BYTES*}bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight;
        BMI.bmiHeader.biClrUsed := 0;
        BMI.bmiHeader.biClrImportant := 0;
        TMP:=GetDIBits(hTmpDC,hTmpBmp,0,1,@pixel,BMI, DIB_RGB_COLORS);
        Pixel:=Pixel and $FFFFFF;
        ReleaseDC(hGame,hGDC);
        Result:=pixel;
end;

Автор: Bitter 15.4.2011, 16:15
Используй ScanLine

Автор: welt 15.4.2011, 17:06
нет, надо на Win Api чтобы можно было откомпилировать без всяких встроенных функций

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)