![]() |
|
|
#1
|
|||
|
|||
![]() Добрый день знатоки) помогите с переводом из HDC в файл. поясню, функцией GetWindowDC получаю HDC окна, как мне далее, используя только winapi сохранить в файл то что там внутри, если я знаю размеры изображения... выражусь иначе на всякий случай, как мне узнать область памяти где хранится изображение ну и т д, в общем получить ту картинку не используя модуль графикс и т д, только апикой?
|
#2
|
||||
|
||||
![]() через BitBlt отрисуй свой device context на предварительно созданый device context BITMAP'а и сохряняй BITMAP в файл. пример есть в Win32 SDK Reference.
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
![]() да про BitBlt знаю, я не знаю как создать свой HDC и как потом до указателя на памть всего этого дела дойти, я в графике не очень) интернет копал, нашёл что то на английском и не на делфях, не помого( там не много строчек будет? может поможете подробней?
|
#4
|
||||
|
||||
![]() много писать лень, да и некогда, собираюсь в Assassin’s Creed III зарубить...
а так CreateCompatibleDC, CreateBitmap, SelectObject, BitBlt, GetDIBits... вообщем можно у TBitmap в Graphics посмотреть сохранение или в Win32 SDK Reference. Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() Ладно, в графикс тбитмап первым делом посмотрел, но там извращение такое %-| фиг чего уследишь) сейчас сишную в делфю перевести пытаюсь
преобразовал вот это Код:
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; но не работает( помогите, подскажите, поправьте пожалуйста Последний раз редактировалось reqyz, 05.12.2012 в 15:36. |
#6
|
|||
|
|||
![]() Ну кто нибудь!!!! помогите, я не в том разделе написал что-ли?
|