Kod w c++, pozmaieniaj = na :=, wskazniki & na @ etc...
albo poczytaj o GetDIBits na MSDN
//Można użyć w C bezpośrednio gdyż nie zastosowałem
//klasy CBitmap oraz strumieni do zapisu plikó.
void SaveBitmap(wchar_t *szFilename,HBITMAP hBitmap)
{
HDC dc;
FILE* fp;
LPVOID pBuf = NULL;
BITMAPINFO BI;//Struktura zawierająca opis bitmapy (kolor etc)
BITMAPFILEHEADER BFH; //Struktura związana z opisem nagłówka WindowsBitmap
//pobieramy kontekst w przypadku gdy parametr równy jest NULL
//pobrany zostanie kontekst całego ekranu.
dc = GetDC(NULL);
ZeroMemory(&BI,sizeof(BITMAPINFO));
//rozmiar powinien być taki jak rozmiar struktury
//(dzięki temu można rozpoznać wersje).
BI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
//Funkcja GetDIBits gdy parametr lvpBits jest róny NULL
//zwraca liczbę ScanLines (nie mam pojęcia jak to przetłumaczyć)
//Dzieki tym informacją możliwe jest zaalokowanie odpowiedniej
//pamięci dla bitmapy.
GetDIBits(dc,hBitmap,0,0,NULL,&BI,DIB_RGB_COLORS);
//Gdy to pole nie ustawione lub mniejsze od zera, należy
//samemu obliczyć rozmiar bitmapy na podstawie wysokości,
//szerokości oraz liczby kolorów.
if(BI.bmiHeader.biSizeImage<=0)
BI.bmiHeader.biSizeImage=BI.bmiHeader.biWidth*abs(BI.bmiHeader.biHeight)*(BI.bmiHeader.biBitCount+7)/8;
//teraz już można przydzielić pamięć dla bitmapy
if((pBuf = malloc(BI.bmiHeader.biSizeImage))==NULL)
{
MessageBoxW( NULL, L"Nie można alokować pamięci", L"Błąd", MB_OK | MB_ICONERROR);
return;
}
//wybieramy brak kompresji - bitmapa zapisana jako liczby opisujące kolor RGB
BI.bmiHeader.biCompression=BI_RGB;
//w tym przypadku wywołanie funkcji z parametrem lvpBits
//jako przydzielony obszar pamięci: pBuf
//zwróci dane opisujące obraz z uchwytu bitmapy hBitmap do pBuf.
GetDIBits(dc,hBitmap,0,BI.bmiHeader.biHeight,pBuf, &BI, DIB_RGB_COLORS);
//
if((_wfopen_s(&fp,szFilename,L"wb"))!= 0 )
{
//bardziej kulturalne było by zrealizowanie tego za pomocą wyjątków
if (dc) ReleaseDC(NULL,dc);
if (pBuf) free(pBuf);
MessageBoxW( NULL, L"Nie można utworzyć bitmapy", L"Błąd", MB_OK | MB_ICONERROR);
return;
}
//rozmiar pliku
BFH.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+BI.bmiHeader.biSizeImage;
//początek pliku zaczyna się od znakó BM, notacja związana z zapisem liczb
BFH.bfType='MB';
//miejsce od kiedy zaczynają się dane opisujące obraz
BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
//zapis do pliku
fwrite(&BFH,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&BI.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(pBuf,BI.bmiHeader.biSizeImage,1,fp);
//zwalniamy zasoby i zamykamy pliki
if (dc) ReleaseDC(NULL,dc);
if (pBuf) free(pBuf);
if (fp) fclose(fp);
}