16,473
社区成员
发帖
与我相关
我的任务
分享
bool Cgdiplus_testDlg::SaveHdcPng(int alphaVal)
{
HDC hDC = ::GetDC(m_hWnd);
HDC hMemDC = ::CreateCompatibleDC(hDC);
RECT rect;
GetClientRect(&rect);
int w = rect.right - rect.left;
int h = rect.bottom - rect.top;
BYTE* picData = new BYTE[w*h * 4];
memset(picData, 0, w*h * 4);
Gdiplus::Bitmap bitmap(w, h, w * 4, PixelFormat32bppARGB, picData);
HBITMAP hbitmap;
bitmap.GetHBITMAP(Color(0xff0000), &hbitmap);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hbitmap);
BitBlt(hMemDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top,
hDC, 0, 0, SRCCOPY);
Gdiplus::Bitmap *pbmSrc = Gdiplus::Bitmap::FromHBITMAP(hbitmap, NULL);
Gdiplus::Rect rcImage(0, 0, bitmap.GetWidth(), bitmap.GetHeight());
Gdiplus::BitmapData bitmapData;
pbmSrc->LockBits(&rcImage, Gdiplus::ImageLockModeRead, pbmSrc->GetPixelFormat(), &bitmapData);
Gdiplus::Bitmap pBitmapSave(bitmapData.Width, bitmapData.Height, bitmapData.Stride, PixelFormat32bppARGB, (BYTE*)bitmapData.Scan0);
DWORD alph = alphaVal << 24;
if (PixelFormat32bppARGB == pBitmapSave.GetPixelFormat()) {
for (int i = 0; i < pBitmapSave.GetWidth(); i++) {
for (int j = 0; j < pBitmapSave.GetHeight(); j++) {
int x = (i*pBitmapSave.GetWidth() + j) * 4;
Gdiplus::Color pixelColor;
pBitmapSave.GetPixel(i, j, &pixelColor);
ARGB argb = pixelColor.GetValue();
ARGB argb2 = argb | alph;
pixelColor.SetValue(argb2);
pBitmapSave.SetPixel(i, j, pixelColor);
}
}
}
pbmSrc->UnlockBits(&bitmapData);
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
if (pBitmapSave.Save(L"C:\\test2.png", &pngClsid) == Ok) {
printf("save success \n");
}
::ReleaseDC(m_hWnd, hDC);
::DeleteDC(hMemDC);
delete(picData);
delete(pbmSrc);
DeleteObject(hbitmap);
return 0;
}