从RGBQUAD指针创建magick++图像
Create a Magick++ Image from an RGBQUAD pointer
我需要将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
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 当我调用它来解码 Blob 对象中的 png 图像时,"Magick++::readImages"引发警告
- 如何使用ImageMagick Magick 将图像作为gif写为blob
- 将BLOB读取到图像时出现Magick++错误
- 从Magick++图像中加载内存(libharu)中的图像
- 将图像实例另存为 png Magick++
- 如何将多页Magick++图像转换为QImage
- 从RGBQUAD指针创建magick++图像
- 如何在Magick++中以灰度格式写入图像
- 处理大型TIFF图像C++/Magick/libtiff
- magick++显示图像与CGI
- magick++修剪像素不是背景颜色(像素的顶部和底部的图像相同的颜色)