Gdiplus-创建graphics三种方法

Posted 天子骄龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gdiplus-创建graphics三种方法相关的知识,希望对你有一定的参考价值。

 

方法一:利用环境句柄

    HDC hdc = ::GetDC(m_hWnd);
    Graphics graphics(hdc);//创建Graphics对象--创建画布
    //参数:HDC

 

 

 

 

 

 

 

 

使用 Gdiplus 在 Win32 中创建位图

【中文标题】使用 Gdiplus 在 Win32 中创建位图【英文标题】:Bitmap creation in Win32 using Gdiplus 【发布时间】:2020-03-13 19:10:40 【问题描述】:

我正在尝试使用 Win32 和 Gdiplus 创建位图。我不想加载我只想使用 Setpixel 创建自己的图像的文件。我使用了这个构造函数:

void Bitmap(INT width, INT height, INT stride, PixelFormat format, BYTE *scan0);

但是,当我尝试在我的位图上使用 Setpixel 时,即使 GetHeight 返回 0,它也无济于事。

m_pixelMap = new BYTE[m_renderSpaceWidth*m_renderSpaceHeight * 3];
Gdiplus::Bitmap img(m_renderSpaceWidth, m_renderSpaceHeight, 24 * m_renderSpaceWidth, PixelFormat24bppRGB, m_pixelMap);
std::cout << "H: " << img.GetHeight() << std::endl;

我做错了什么?

【问题讨论】:

stride 是指从一行到下一行的字节数,而不是位数。此外,位图行必须是 DWORD 对齐的;根据 24 bpp 位图的宽度,您可能需要为每行填充字节以满足此要求。 我将 24 位更改为 3 个字节,但仍然一无所获。关于 DWORD 对齐,我稍后会处理,但现在我只想获得我的图像高度。 好的,我明白了。我是 Gdiplus 的新手,我不知道我必须初始化它。 【参考方案1】:

所以我不知道我必须先初始化 Gdiplus,这就是我所缺少的。我稍微改变了位图的创建。现在一切正常。

m_stride =  ALIGN_CLUSPROP(3 * m_renderSpaceWidth);
m_padding = m_stride - (m_renderSpaceWidth * 3);
m_horizontalScanLine = (m_renderSpaceWidth * 3) + m_padding;

m_pixelMap = new BYTE[m_stride * m_renderSpaceHeight];
m_bitmap = new Gdiplus::Bitmap(m_renderSpaceWidth, m_renderSpaceHeight, m_stride, PixelFormat24bppRGB, m_pixelMap);

【讨论】:

以上是关于Gdiplus-创建graphics三种方法的主要内容,如果未能解决你的问题,请参考以下文章

Gdiplus::Graphics::DrawLine绘制直线

我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?

Gdiplus::Graphics::FillEllipse填充椭圆

GDIPlus绘制桌面歌词

Gdiplus::Pen画笔

在 C++ 中使用 Gdiplus 创建透明位图