直接在.png加载的cimage上绘制时,将文本颜色设置为

Set the text color when drawing directly on a CImage loaded from .png

本文关键字:文本 颜色 设置 绘制 png 加载 cimage      更新时间:2023-10-16

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

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

正如@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()

您需要将bkmode设置为tranparent cdc :: setbkmode。因此,文本颜色用于绘制字符,背景是透明的。

GDI不可能用Alpha通道绘制PNG透明。您可以使用GDI 来完成此操作。请参阅此处的样本