Тема: HDC в файл
Показать сообщение отдельно
  #5  
Старый 05.12.2012, 14:25
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Ладно, в графикс тбитмап первым делом посмотрел, но там извращение такое %-| фиг чего уследишь) сейчас сишную в делфю перевести пытаюсь

преобразовал вот это
Код:
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;

но не работает( помогите, подскажите, поправьте пожалуйста
Ответить с цитированием