visual-c++ - Gdiplus 64 位颜色

标签 visual-c++ graphics image-processing 64-bit gdi+

我正在创建一个 64 位位图并使用 Graphics 对象将其包装起来以在其上绘制。 问题是 Gdiplus 颜色类只有 32 位(每个组件只有字节,即最大 255)所以我如何使用 gdiplus 绘制 64 位图像? 例如

Bitmap bmp(100, 100, PixelFormat64bppARGB);

Graphics g(&bmp);
//how do I draw a red line now, if i use Color(255,0,0) it comes as almost dark black red

最佳答案

Gdiplus 似乎不支持任何 64 位操作。一种仍然能够使用 Gdiplus 方法的简单方法是将图像拆分为两个 32 位图像并分别对其进行操作。

您可以将 ARGB channel 拆分为 AARR 和 GGBB,或者使用两个具有较低和较高 ARGB 位的 32 位图像。

这两种变体都需要您编写包装函数或将每个调用分成两部分,如下所示:

// This is what you want to do (ARGB, 16 bit per channel)
// g.DrawLine(new Pen(Color(0, 65535, 1024, 31), 1, 0, 0, 100, 100);

// AARR GGBB variant
gAARR.DrawLine(new Pen(Color(0,0,255,255), 1, 0, 0, 100, 100);
gGGBB.DrawLine(new Pen(Color(4,0,0,31), 1, 0, 0, 100, 100);

// ARGBhigh ARGBlow variant
gHigh.DrawLine(new Pen(Color(0,255,4,0), 1, 0, 0, 100, 100);
gLow.DrawLine(new Pen(Color(0,255,0,31), 1, 0, 0, 100, 100);

请注意,我在这里使用了 Color(A,R,G,B) 顺序,但我不确定。根据MSDN documentation ,这必须改为 Color(R,G,B,A)。如果您不需要 alpha channel ,您应该更喜欢 highlow 变体,因为您仍然可以使用它来使用 Color(R,G,B)。

要显示或保存结果,您需要合并 2 个缓冲区。

关于visual-c++ - Gdiplus 64 位颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/621624/

相关文章:

visual-c++ - MFC 如何创建具有滚动功能的上下文菜单

java - 使用图形在图像上进行文本换行?

java - 将图形保存为图像?

c# - 为什么精确的图像没有精确的描述符?

python - 如何在 Python 中使用图像处理找到物体的直径?

c++ - 如何从 AVX 寄存器中获取数据?

c++ - 实现嵌套在模板类中的类的成员函数

c++ - 如何让 PostgreSQL 加载依赖于 DLL 的 C 模块?

c# - SetPixel 太慢了。有没有更快的方法来绘制位图?

image-processing - Graphicsmagick如何删除透明区域并缩小32位图像的 Canvas 大小