
05.12.2012, 22:47
|
 |
.
|
|
Регистрация: 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 в.д.
|