BMP in PNG
-
Ich hole mir mit folgendem Code einen Screenshot und täte diesen nun gerne als PNG speichern. Wie muss ich vorgehen.(Einach BI_PNG benutzen geht ja nicht.)
#include<windows.h> int main() { int nWidth = GetSystemMetrics(SM_CXSCREEN); int nHeight = GetSystemMetrics(SM_CYSCREEN); HWND hWnd = ::GetDesktopWindow(); HDC hdc = ::GetDC(hWnd); HDC memDC = ::CreateCompatibleDC(hdc); HBITMAP hbm = ::CreateCompatibleBitmap(hdc, nWidth, nHeight); HBITMAP hbmOld = (HBITMAP)::SelectObject(memDC, hbm); ::BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY); BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nWidth; bmi.bmiHeader.biHeight = nHeight; bmi.bmiHeader.biBitCount = 16; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = nWidth * nHeight * bmi.bmiHeader.biBitCount/8; BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage]; ::GetDIBits( memDC, hbm, 0, bmi.bmiHeader.biHeight, pbBits, &bmi, DIB_RGB_COLORS ); BITMAPFILEHEADER bfh; bfh.bfType = ('M' << 8) + 'B'; bfh.bfSize = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); HANDLE hfile = CreateFile( TEXT("c:\\screen.png"), GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 ); DWORD dwWritten; WriteFile(hfile,&bfh, sizeof(bfh), &dwWritten, NULL); WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(hfile,pbBits, bmi.bmiHeader.biSizeImage, &dwWritten, NULL); CloseHandle(hfile); ::SelectObject(memDC, hbmOld); ::DeleteDC(memDC); ::ReleaseDC(hWnd,hdc); ::DeleteObject(hbm); delete[] pbBits; }
Ps: Bin mit WinAPi noch nicht so der Held
-
GDI+ kann z.B. png speichern
-
Danke erstmals.
Dann noch zwei fragen:
1. wie mache ich das mit gdi+?
2. wie kann ich png dateien wieder in bmp konvertieren?
-
Speichern als png ist sogar als 'Example' in der msdn:
http://msdn2.microsoft.com/en-us/library/ms535407.aspxBilddateien öffnen kann man z.B. mittels Bitmap.FromFile() (erkennt z.B. bmp, jpg, png, gif)
Im C++-Magazin (siehe Forum hier unten) gibt es auch noch nen Artikel über GDI+Einfach mal ein wenig in der msdn stöbern:
http://msdn2.microsoft.com/en-us/library/ms533798.aspx