java graphics gdi_如何将GDI Graphics / HDC保存到文件中?

我无法将从设备上下文HDC派生的GDI Graphics对象保存到文件中 .

What works :我能够保存从Bitmap派生的GDI图形 . 示例代码(Win32):

Color color(255, 0, 0);

Pen pen(color, 2.0f);

CLSID pngClsid;

if(GetEncoderClsid(L"image/bmp", &pngClsid) < 0) // calls GetImageEncoders()

return;

// Graphics from Bitmap - works OK

Bitmap bitmap(300, 300, PixelFormat24bppRGB); // create Bitmap first

Graphics *graphics = new Graphics(&bitmap); // create Graphics second

graphics->Clear(Color(255, 255, 255, 255));

Status stat = graphics->DrawEllipse(&pen, 50, 50, 100, 100);

assert(stat == Ok);

stat = bitmap.Save(L"C:\\temp\\test1.bmp", &pngClsid, NULL);

assert(stat == Ok);

delete graphics;

结果:

d25f9d61-594a-4c4d-9bde-4d187678aca4.png

What fails :如果Graphics对象是从HDC派生的,我得到一个黑色矩形 . 无论我是在点[1],[2]还是[3]创建位图,我总是得到一个黑色矩形 . 码:

CLSID pngClsid;

if(GetEncoderClsid(L"image/bmp", &pngClsid) < 0) // calls GetImageEncoders()

return;

// Graphics from HDC - fails

HDC hdc = GetDC(NULL);

Graphics *graphicsDC = new Graphics(hdc); // create Graphics first

graphicsDC->SetPageUnit(UnitPixel);

//Bitmap bitmapDC(300, 300, graphicsDC); // [1] create Bitmap second. Black rectangle if called here

graphicsDC->Clear(Color(255, 255, 255, 255));

//Bitmap bitmapDC(300, 300, graphicsDC); // [2] black rectangle if called here

HPEN penGDI = CreatePen(PS_SOLID, 3, RGB(0, 255, 0)); // old school GDI

HPEN oldPen = (HPEN)SelectObject(hdc, penGDI);

Ellipse(hdc, 50, 50, 150, 150);

DeleteObject(SelectObject(hdc, oldPen));

Bitmap bitmapDC(300, 300, graphicsDC); // [3] black rectangle if called here

Status stat = bitmapDC.Save(L"C:\\temp\\test2.bmp", &pngClsid, NULL);

assert(stat == Ok);

delete graphicsDC;

ReleaseDC(NULL, hdc);

结果:

f9908106-c63e-4627-abc6-e7bcfa4c88e0.png

Why I need this :我正在将包含数千个调用的代码转换为GDI API . 我想逐渐开始使用GDI,而不是立即将所有GDI调用转换为GDI . 我在其他情况下成功地混合了GDI / GDI,例如在创建渐变时 . 唯一的区别是,在其他情况下,我没有尝试保存到文件 .

我不能使用 CImage 因为它没有groovy抗锯齿 .

那么,如何从HDC开始时将图形保存为图像?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值