3

我正在创建一个 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
4

3 回答 3

2

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

您可以将 ARGB 通道拆分为 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 文档,这必须改为 Color(R,G,B,A) 。如果您不需要 alpha 通道,您应该更喜欢 highlow 变体,因为您仍然可以使用 Color(R,G,B) 。

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

于 2009-03-07T10:24:22.927 回答
1

您不能根据MSDN - Image Pixel Format Constants

评论

PixelFormat48bppRGB, PixelFormat64bppARGB, 并且 PixelFormat64bppPARGB每个颜色分量(通道)使用 16 位。Microsoft Windows GDI+ 1.0 版可以读取每通道 16 位的图像,但此类图像会转换为每通道 8 位的格式以进行处理、显示和保存。

于 2010-01-30T11:00:14.013 回答
0

您可以使用此 Bitmap 构造函数来设置像素格式:

public:
Bitmap(
    int width, 
    int height, 
    PixelFormat format
)

编辑:您将无法使用 Color 类(我认为),因为它只支持 32 位颜色。但是,您可以在 Bitmap 上调用 LockBits 并手动循环遍历它。

于 2009-03-07T10:16:42.977 回答