Gdiplus 64bit颜色

时间:2009-03-07 10:13:08

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

我正在创建一个64位位图并使用Graphics对象将其包装以绘制它。 问题是Gdiplus Color类只有32位(每个组件只有字节,即最大255),那么如何使用gdiplus绘制64位图像呢? e.g。

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

3 个答案:

答案 0 :(得分: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);

请注意,我在这里使用了颜色(A,R,G,B)顺序,我不确定。根据{{​​3}},必须将其更改为Color(R,G,B,A)。如果你不需要alpha通道,你应该更喜欢highlow变种,因为你仍然可以使用Color(R,G,B)。

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

答案 1 :(得分:1)

你无法根据MSDN - Image Pixel Format Constants

  

<强>说明

     

PixelFormat48bppRGB,   PixelFormat64bppARGB,和   PixelFormat64bppPARGB每个使用16位   颜色成分(通道)。微软   Windows GDI + 1.0版可以读取   每通道16位图像,但是这样   图像转换为   每通道8位格式   处理,显示和保存。

答案 2 :(得分:0)

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

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

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