从RGBQUAD指针创建Magick ++图像

时间:2016-08-12 12:48:00

标签: c++ imagemagick

我需要将RGBQUAD指针转换为Magic::Image。我试过下面的代码。但是,它与Magick::ErrorCorruptImage

崩溃了
Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD));
Image img;
img.size(Geometry(width, height));
img.magick("RGBA");
img.read(blob);

那么如何将RGBQUAD数组转换为Magick :: Image?

1 个答案:

答案 0 :(得分:0)

我认为错误是由“RGBA”格式默认为Quantum大小引起的。通常是16Q

只需将Magick::Image.depth设置为8Q,因为RGBQUAD应为BYTE数据类型。

Blob blob = Blob(pBuffer, width*height*sizeof(RGBQUAD));
Image img;
img.size(Geometry(width, height));
img.depth(8);
img.magick("RGBA");
img.read(blob);

... 但是 ...... 在RGBQUAD中保留最后一个字节,而不是alpha通道。从文档引用...

  

<强> rgbReserved

     

此成员已保留,且必须为零。

这会使您传递给ImageMagick的任何blob透明。

我建议将数据复制到新缓冲区,并确保最后一个字节是完全不透明的。

例如......

// Note: I'm using data type `uint8_t' over `BYTE' for no particular reason.
size_t rgbquad_size = sizeof(RGBQUAD);
size_t total_bytes = width * height * rgbquad_size;
uint8_t * pCopyBuffer = new uint8_t[total_bytes];
for (size_t cursor = 0; cursor < total_bytes; ++cursor) {
    if (cursor % rgbquad_size < rgbquad_size - 1) {
        pCopyBuffer[cursor] = pBuffer[cursor];
    } else {
        pCopyBuffer[cursor] = 0xFF;
    }
}
Blob blob = Blob(pCopyBuffer, total_bytes);

根据评论进行修改

如果将pBuffer定义为RGBQUAD *,则迭代它们会更容易,并指定Alpha通道值。

for (size_t cursor = 0; cursor < width*height; ++cursor)
    pBuffer[cursor].rgbReserved = 0xFF; // Set Alpha