直接在从.png加载的CImage上绘制时设置文本颜色

时间:2014-01-21 10:17:02

标签: c++ mfc visual-studio-2013 atl

我的问题是:如果我直接在先前从.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 );

......但没有任何改变......有什么建议吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您需要将BkMode设置为TRANPARENT CDC::SetBkMode。所以文本颜色用于绘制字符,背景是透明的。

使用GDI无法使用Alpha通道绘制PNG透明度。你可以用GDI +做到这一点。请参阅示例here