使用win32 API或GDI+保存到位图
saving to bitmap with win32 API or GDI+
问题很简单,但我找不到好的&我在互联网上的问题的干净解决方案。我得到的是我窗户上的一些画。现在,我可以使用BitBlt函数将那些从窗口设备上下文保存到图像设备上下文,也可以从那里保存到位图句柄:
HDC bitmapDC = CreateCompatibleDC(dc);
HBITMAP bitmap = CreateCompatibleBitmap(bitmapDC, 200, 200);
SelectObject(bitmapDC,bitmap);
BitBlt(bitmapDC, 0, 0, 200, 200, dc, 200, 200, SRCCOPY);
但从那以后,我迷失了方向。我看了一下GDI+Bitmap类,它有save函数,我发现了如何实现检索图片编码CLSID的代码。然而,我不知道我是否正确地使用了对该类的加载。HBITMAP有一个重载的构造函数,但它也要求一些调色板,我将其设置为NULL:
Bitmap image(bitmap,NULL);
我试图保存png文件,但它导致了黑色方块,没有我期望的图纸。如果你愿意,我的绘画程序的完整代码:
void GetCLSID(const WCHAR* format, CLSID* pClsid){
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
}
}
}
void OnPaint(HDC dc){
RECT rect; rect.bottom = 0; rect.top = 20; rect.left = 0; rect.right = 100;
HBRUSH blueBrush = CreateSolidBrush(RGB(0,0,200));
FillRect(dc, &rect, blueBrush);
Graphics graphics(dc);
Pen pen(Color(255, 0, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
SolidBrush greenBrush(Color(0,200,0));
Rect ellipseRect(20,20,20,20);
graphics.FillEllipse(&greenBrush, ellipseRect);
SolidBrush redBrush(Color(200,0,0));
Rect boxRectangle(0,40,20,100);
graphics.FillRectangle(&redBrush, boxRectangle);
pen.SetColor(Color(200,0,200));
pen.SetWidth(20);
graphics.DrawBezier(&pen, 100, 20, 130, 40, 200, 10, 230, 20);
HDC bitmapDC = CreateCompatibleDC(dc);
HBITMAP bitmap = CreateCompatibleBitmap(bitmapDC, 200, 200);
SelectObject(bitmapDC,bitmap);
BitBlt(bitmapDC, 0, 0, 500, 500, dc, 500, 500, SRCCOPY);
Bitmap image(bitmap,NULL);
CLSID clsID;
GetCLSID(L"image/png", &clsID);
image.Save(L"pic.png", &clsID);
}
我甚至无法想象简单的储蓄会成为这样的问题,所以我很乐意得到任何帮助,谢谢!
我在这里给出的代码可以满足您的需求:如何将子窗口的客户端区域保存为位图文件?
它在C中非常冗长。它在C++中要好得多,因为CImage
相关文章:
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- 将 exr/pfm 保存到位图 CImg
- 保存的 Gdiplus::位图始终具有 Alpha 通道 (RGBA/ARGB)
- 从HWND获取并保存位图(每个像素8,4,1位-黑色图像)
- GDI - 是否可以在WM_PAINT调用之间将位图保存在内存中
- 除非先使用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败
- 正在尝试为多种BPP格式创建“保存位图”功能
- 保存位图文件
- 将位图保存到加载它的文件中
- 为什么我需要保存句柄到一个旧的位图,而绘制与Win32 GDI