直接在从 .png 加载的 CImage 上绘制时设置文本颜色
Posted
技术标签:
【中文标题】直接在从 .png 加载的 CImage 上绘制时设置文本颜色【英文标题】:Set the text color when drawing directly on a CImage loaded from .png 【发布时间】:2014-02-10 21:00:15 【问题描述】:我的问题是:如果我直接在以前从 .PNG 文件加载的 CImage 上绘制一些文本。文本本身是透明的(您可以通过它看到背景颜色)并且无法获得所需的颜色。
CImage image;
image.Load ( "myimage.png" ) ;
//Draw some text
HDC dc = image.GetDC ();
SetTextColor ( dc, RGB( 0 , 0 , 0 ) ); ///< I think the problem is here
DrawText ( dc, "Hello world!", -1, CRect ( 0 , 0 , 200 , 200 ), 0 );
image.ReleaseDC ();
//Render of the image somewhere
image.Draw ( someOutDC , 0 , 0 );
我尝试了不同的 RGB 值和 .PNG,有或没有透明颜色,但结果相同。仅当我从 .BMP 或 .JPG 加载时它才有效(但我需要 .PNG)。 有一些关于 .PNG 的内容,但我不知道如何正确设置文本颜色。
我忘了说 我也试过这样的 Alpha RGB:
SetTextColor ( dc , RGB (0,0,0) + 255 << 24 );
...但没有任何改变...有什么建议吗?
【问题讨论】:
听起来 CImage 正在从 PNG 文件制作 32 位 DIB。不幸的是,仅用于绘制文本的 GDI 函数(有用地)操纵 24 个 RGB 位 - 它们将 8 个 Alpha 位设置为 0。解决方案是使用 GDI+ 文本绘制函数,它可以处理完整的 32 位。 我认为你是对的,我将研究如何做到这一点。 就是这样,我使用了 GDI+,它运行良好。很抱歉我的分数太低,明天我才能回答自己。 【参考方案1】:正如@enhzflep 所说,GDI 无法正确处理 Alpha 通道,因此在处理 32 Bpp 图像时,您必须使用如下 GDI+ 功能:
#include <GdiPlus.h>
#pragma comment(lib,"gdiplus.lib")
//....
Gdiplus::Graphics graphics ( image.GetDC () );
Gdiplus::Font font ( &FontFamily ( L"Arial" ), 10 );
Gdiplus::SolidBrush brush ( Color ( 255, 0, 0, 0 ) );
graphics.DrawString ( L"Hello world", -1, &font, PointF(0.0f, 0.0f), &brush );
image.ReleaseDC()
【讨论】:
【参考方案2】:您需要将 BkMode 设置为 TRANPARENT CDC::SetBkMode。所以文字颜色用来绘制字符,背景是透明的。
使用 GDI 无法使用 Alpha 通道绘制透明的 PNG。您可以使用 GDI+ 来做到这一点。查看示例here
【讨论】:
SetBkMode 用于文本的背景,而不是文本本身和 CImage 正确绘制 Alpha 通道。我认为@enhzflep 明白了这一点。 好的。对不起,比我误解了这个问题。以上是关于直接在从 .png 加载的 CImage 上绘制时设置文本颜色的主要内容,如果未能解决你的问题,请参考以下文章
VC++如何将rc资源中的图片加载到MFC的CImage对象中(附源码)
VC下加载多种格式图片的方法总结IPicture, CxImage, CImage(AtlImage), CPictureEx