从RGBQUAD指针创建magick++图像

Create a Magick++ Image from an RGBQUAD pointer

本文关键字:magick++ 图像 创建 指针 RGBQUAD      更新时间:2023-10-16

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

我认为错误是由"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通道。引用自docs…

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