Тема: HDC в файл
Показать сообщение отдельно
  #8  
Старый 05.12.2012, 22:47
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Как то писал для подобных случаев
Код:
procedure SaveBitmap(Name : String; bmp : HBITMAP);
var
  FileHandle	: THandle;
  Size, Res,
  HeaderSize	: DWORD;
  BFH		: TBITMAPFILEHEADER;
  BIH		: TBITMAPINFOHEADER;
  FDIB		: TDIBSection;

  function BytesPerScanline(PixelsPerScanline, BitsPerPixel, Alignment: Longint): Longint;
  begin
    dec(Alignment);
    Result := ((PixelsPerScanline * BitsPerPixel) + Alignment) and not Alignment;
    Result := Result div 8;
  end;

  procedure InitializeBitmapInfoHeader(Bitmap: HBITMAP; var BI: TBitmapInfoHeader);
  var
    DS		: TDIBSection;
    Bytes	: Integer;
  begin
    DS.dsbmih.biSize := 0;
    Bytes := GetObject(Bitmap, SizeOf(DS), @DS);
    if (Bytes >= (SizeOf(DS.dsbm) + SizeOf(DS.dsbmih))) and (DS.dsbmih.biSize >= SizeOf(DS.dsbmih)) then
      BI := DS.dsbmih
    else
    begin
      FillChar(BI, SizeOf(BI), 0);
      with BI, DS.dsbm do
      begin
	biSize   := SizeOf(BI);
	biWidth  := bmWidth;
	biHeight := bmHeight;
      end;
    end;
    BI.biBitCount := DS.dsbm.bmBitsPixel * DS.dsbm.bmPlanes;
    BI.biPlanes   := 1;
    if BI.biSizeImage = 0 then
      BI.biSizeImage := BytesPerScanLine(BI.biWidth, BI.biBitCount, 32) * Abs(BI.biHeight);
  end;

begin
  GetObject(bmp, SizeOf(FDIB), @FDIB);
  with FDIB, dsbm, dsbmih do
  begin
    biSize     := sizeof(dsbmih);
    biWidth    := bmWidth;
    biHeight   := bmHeight;
    biPlanes   := 1;
    biBitCount := bmPlanes * bmBitsPixel;
  end;
  
  InitializeBitmapInfoHeader(Bmp, BIH);
  HeaderSize := SizeOf(TBitmapInfoHeader);
  Size := BIH.biSizeImage;
  inc(Size, HeaderSize + SizeOf(BFH));

  FillChar(BFH, SizeOf(BFH), 0);
  BFH.bfType    := $4D42;
  BFH.bfSize    := Size;
  BFH.bfOffBits := SizeOf(BFH) + HeaderSize;

  FileHandle := CreateFile(PChar(Name + '.bmp'), GENERIC_WRITE, FILE_SHARE_WRITE, NIL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  WriteFile(FileHandle, BfH, SizeOf(BFH), Res, NIL);
  WriteFile(FileHandle, FDIB.dsbmih, SizeOf(FDIB.dsbmih), Res, NIL);
  WriteFile(FileHandle, FDIB.dsbm.bmBits^, FDIB.dsbmih.biSizeImage, Res, NIL);
  CloseHandle(FileHandle);
end;
Рассчитпно на 24-битный битмап.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием