我需要将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?
答案 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