Ладно, в графикс тбитмап первым делом посмотрел, но там извращение такое %-| фиг чего уследишь) сейчас сишную в делфю перевести пытаюсь
преобразовал вот это
Код:
inline int GetFilePointer(HANDLE FileHandle){
return SetFilePointer(FileHandle, 0, 0, FILE_CURRENT);
}
bool SaveBMPFile(char *filename, HBITMAP bitmap, HDC bitmapDC, int width, int height){
bool Success=0;
HDC SurfDC=NULL;
HBITMAP OffscrBmp=NULL;
HDC OffscrDC=NULL;
LPBITMAPINFO lpbi=NULL;
LPVOID lpvBits=NULL;
HANDLE BmpFile=INVALID_HANDLE_VALUE;
BITMAPFILEHEADER bmfh;
if ((OffscrBmp = CreateCompatibleBitmap(bitmapDC, width, height)) == NULL)
return 0;
if ((OffscrDC = CreateCompatibleDC(bitmapDC)) == NULL)
return 0;
HBITMAP OldBmp = (HBITMAP)SelectObject(OffscrDC, OffscrBmp);
BitBlt(OffscrDC, 0, 0, width, height, bitmapDC, 0, 0, SRCCOPY);
if ((lpbi = (LPBITMAPINFO)(new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)])) == NULL)
return 0;
ZeroMemory(&lpbi->bmiHeader, sizeof(BITMAPINFOHEADER));
lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
SelectObject(OffscrDC, OldBmp);
if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, NULL, lpbi, DIB_RGB_COLORS))
return 0;
if ((lpvBits = new char[lpbi->bmiHeader.biSizeImage]) == NULL)
return 0;
if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi, DIB_RGB_COLORS))
return 0;
if ((BmpFile = CreateFile(filename,
GENERIC_WRITE,
0, NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE)
return 0;
DWORD Written;
bmfh.bfType = 19778;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
return 0;
if (Written < sizeof(bmfh))
return 0;
if (!WriteFile(BmpFile, &lpbi->bmiHeader, sizeof(BITMAPINFOHEADER), &Written, NULL))
return 0;
if (Written < sizeof(BITMAPINFOHEADER))
return 0;
int PalEntries;
if (lpbi->bmiHeader.biCompression == BI_BITFIELDS)
PalEntries = 3;
else PalEntries = (lpbi->bmiHeader.biBitCount <= 8) ?
(int)(1 << lpbi->bmiHeader.biBitCount) : 0;
if(lpbi->bmiHeader.biClrUsed)
PalEntries = lpbi->bmiHeader.biClrUsed;
if(PalEntries){
if (!WriteFile(BmpFile, &lpbi->bmiColors, PalEntries * sizeof(RGBQUAD), &Written, NULL))
return 0;
if (Written < PalEntries * sizeof(RGBQUAD))
return 0;
}
bmfh.bfOffBits = GetFilePointer(BmpFile);
if (!WriteFile(BmpFile, lpvBits, lpbi->bmiHeader.biSizeImage, &Written, NULL))
return 0;
if (Written < lpbi->bmiHeader.biSizeImage)
return 0;
bmfh.bfSize = GetFilePointer(BmpFile);
SetFilePointer(BmpFile, 0, 0, FILE_BEGIN);
if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
return 0;
if (Written < sizeof(bmfh))
return 0;
return 1;
}]
в это
Код:
function SaveBMPFile(filename:PChar;bitmap:HBITMAP;width,height:integer):boolean;
var
Success:boolean;
SurfDC,OffscrDC:HDC;
OffscrBmp,OldBmp:HBITMAP;
lpbi:PBitmapInfo;
// lpvBits:LPVOID;
BmpFile:THANDLE;
bmfh:BITMAPFILEHEADER;
lpvBits:Pointer;
Written:DWORD;
PalEntries:integer;
//
bitmapDC:HDC;
begin
bitmapDC:=GetWindowDC(bitmap);
// bitmap:=GetBitmapFromDesktop(bitmapDC);
Success:=false;
SurfDC:=0;
OffscrBmp:=0;
OffscrDC:=0;
lpbi:=nil;
// lpvBits=NULL;
BmpFile:=INVALID_HANDLE_VALUE;
Result:=false;
OffscrBmp := CreateCompatibleBitmap(bitmapDC, width, height);
if (OffscrBmp = NULL)then
exit;
OffscrDC := CreateCompatibleDC(bitmapDC);
if (OffscrDC = NULL)then
exit;
OldBmp := HBITMAP(SelectObject(OffscrDC, OffscrBmp));
BitBlt(OffscrDC, 0, 0, width, height, bitmapDC, 0, 0, SRCCOPY);
getmem(lpbi,sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
if (lpbi = nil)then
exit;
FillChar(lpbi.bmiHeader,sizeof(BITMAPINFOHEADER),#0);
lpbi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
SelectObject(OffscrDC, OldBmp);
if(GetDIBits(OffscrDC, OffscrBmp, 0, height, nil, lpbi^, DIB_RGB_COLORS)=0)then
exit;
GetMem(lpvBits, lpbi^.bmiHeader.biSizeImage);
// if lpvBits = nil then ...}
if (lpvBits = nil)then
exit;
if (GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi^, DIB_RGB_COLORS)=0)then
exit;
BmpFile:= CreateFile(filename,
GENERIC_WRITE,
0, nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
if (BmpFile = INVALID_HANDLE_VALUE)then
exit;
bmfh.bfType := 19778;
bmfh.bfReserved1 := 0;
bmfh.bfReserved2 := 0;
if (not WriteFile(BmpFile, bmfh, sizeof(bmfh), Written, nil))then
exit;
if (Written < sizeof(bmfh))then
exit;
if (not WriteFile(BmpFile, lpbi.bmiHeader, sizeof(BITMAPINFOHEADER), Written, nil))then
exit;
if (Written < sizeof(BITMAPINFOHEADER))then
exit;
if (lpbi.bmiHeader.biCompression = BI_BITFIELDS)then
PalEntries := 3
else
if((lpbi.bmiHeader.biBitCount <= 8))then
// PalEntries := (int)(1 << lpbi->bmiHeader.biBitCount)
else
PalEntries:=0;
if(lpbi.bmiHeader.biClrUsed<>0)then
PalEntries := lpbi.bmiHeader.biClrUsed;
if(PalEntries<>0)then
begin
if (not WriteFile(BmpFile, lpbi.bmiColors, PalEntries * sizeof(RGBQUAD), Written, nil))then
exit;
if (Written < PalEntries * sizeof(RGBQUAD))then
exit;
end;
bmfh.bfOffBits := GetFilePointer(BmpFile);
if ( not WriteFile(BmpFile, lpvBits, lpbi.bmiHeader.biSizeImage, Written, nil))then
exit;
if (Written < lpbi.bmiHeader.biSizeImage)then
exit;
bmfh.bfSize := GetFilePointer(BmpFile);
SetFilePointer(BmpFile, 0, 0, FILE_BEGIN);
if (not WriteFile(BmpFile, bmfh, sizeof(bmfh), Written, nil))then
exit;
if (Written < sizeof(bmfh))then
exit;
result:=true;
end;
но не работает( помогите, подскажите, поправьте пожалуйста
|