Аналог GetDIBits
От: Maks1509 Россия http://mv-software.narod.ru
Дата: 11.01.20 11:01
Оценка:
Доброго времени суток. Потребовалось написать приложение под WinCE. В коде используется функция GetDIBits, которая и отсутсвует в ОС. Необходимо сделать аналог функции. Поиском выдает что-то непонятное... Попытался сделать сам, но познания в области копирования указателей и прочего очень скудные. Направьте в нужное русло...

В программе в исходниках используется код:

   ldc := CreateCompatibleDC(0);
   GetDIBits(ldc, src, 0, srcbmp.bmHeight, srcdib, srcdibbmap, DIB_RGB_COLORS);
   DeleteDC(ldc);


Я сделал свою функцию:

function GetDIBits2(const hdcSrc: HDC; srcBmp: HBitmap; StartScan, NumScans: UINT;
  out Bits: Pointer; out BitInfo: TBitmapInfo; const Usage: UINT): Integer;
var
  ret   : DWORD;
  bi    : Windows.BITMAP;
  bmi   : TBitmapInfo;
  lpBits: Pointer;
  hbmMem: HBITMAP;
  hbmOld: HBITMAP;
begin

  (*
  {$IFDEF WINCE}
  Result := 0;
  Exit;
  {$ELSE}
  Result := GetDIBits(DC, srcBmp, StartScan, NumScans, Bits, BitInfo, Usage);
  {$ENDIF}

*)

  Result := 0;

  ret := GetObjectW(srcBmp, SizeOf(Windows.BITMAP), @bi);
  if (ret = 0) then
    Exit;

  ZeroMemory(@bmi, SizeOf(TBitmapInfo));

  bmi.bmiHeader.biSize        := SizeOf(bmi.bmiHeader);
  bmi.bmiHeader.biWidth       := bi.bmWidth;
  bmi.bmiHeader.biHeight      := -bi.bmHeight;
  bmi.bmiHeader.biPlanes      := 1;
  bmi.bmiHeader.biBitCount    := 32;
  bmi.bmiHeader.biCompression := BI_RGB;
  bmi.bmiHeader.biSizeImage   := bi.bmWidth * bi.bmHeight * 4;

  hbmMem := CreateDIBSection(hdcSrc, bmi, DIB_RGB_COLORS, lpBits, 0, 0);
  if (hbmMem <> 0) then
  try

    hbmOld := SelectObject(hdcSrc, hbmMem);
    if (hbmOld <> 0) then
    try

      GetObjectW(hbmMem, SizeOf(TBitmapInfo), @bmi);
      BitInfo := bmi;
      //CopyMemory(@BitInfo, @bmi, SizeOf(TBitmapInfo));

      GetObjectW(hbmMem, SizeOf(Windows.BITMAP), @bi);
      Bits := @bi.bmBits;
      //CopyMemory(Bits, bi.bmBits, bmi.bmiHeader.biSizeImage);

    finally
      SelectObject(hdcSrc, hbmOld);
    end;

  finally
    DeleteObject(hbmMem);
  end;

end;


Выдает ахинею из пикселей с утечкой ресурсов. Вот не знаю, сколько ошибок допустил. Если не присваивать Bits к bi.bmBits, вроде без утечки. Вообще, тут многое непонятно. Тут надо выделять память и копировать указатель или можно обойтись присваиванием? Также как и BitInfo с bmi или нет? Хотелось бы знать что делает оригинальная GetDIBits.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.