【问题标题】:Set the text color when drawing directly on a CImage loaded from .png直接在从 .png 加载的 CImage 上绘制时设置文本颜色
【发布时间】: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+,它运行良好。很抱歉我的分数太低,明天我才能回答自己。

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


【解决方案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 明白了这一点。
    • 好的。对不起,比我误解了这个问题。
    猜你喜欢
    • 2020-03-28
    • 2012-10-04
    • 2019-11-26
    • 2010-10-23
    • 2021-06-11
    • 2017-12-30
    • 2015-04-04
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多