我有三个二维数组,它们的大小和rgb的uint16_t值相同。因此,当这些数组完全用数据填充时(我将它们填充在一起,因此同时发生),我必须以PNG或JPG图像格式可视化这些数组,保存它,然后再次开始用新数据填充数组。我正在考虑为每种颜色创建具有3个字段的结构矢量,使用此数据结构mb可以更轻松地完成此任务。有人可以告诉我最好的方法吗?
谢谢。
答案 0 :(得分:1)
如果您使用Magick ++,我相信您想使用Magick::Image.read
方法。具体来说就是功能签名...
Magick ++ / Image.h
// Read single image frame from an array of raw pixels, with // specified storage type (ConstituteImage), e.g. // image.read( 640, 480, "RGB", 0, pixels ); void read(const size_t width_,const size_t height_,const std::string &map_, const StorageType type_,const void *pixels_);
这将允许您从内存地址中任意读取栅格数据;只要您定义大小(宽度和高度),通道映射和存储大小即可。
我有三个二维数组,它们具有一定的大小,并为rgb提供了一些uint16_t值。
我建议将每个阵列“导入”到单个临时图像中,然后将每个颜色通道复合复制到最终图像中。
没有看到您的代码,我想您已经定义了这样的内容...
// Example 4x4 image broken into three 2d arrays.
uint16_t
red[4][4] = {
{0xFFFF,0xFFFF,0xFFFF,0xFFFF},
{0x9999,0x9999,0x9999,0x9999},
{0x6666,0x6666,0x6666,0x6666},
{0x0000,0x0000,0x0000,0x0000}
},
green[4][4] = {
{0xFFFF,0x9999,0x6666,0x0000},
{0xFFFF,0x9999,0x6666,0x0000},
{0xFFFF,0x9999,0x6666,0x0000},
{0xFFFF,0x9999,0x6666,0x0000}
},
blue[4][4] = {
{0x0000,0x0000,0x0000,0x0000},
{0x6666,0x6666,0x6666,0x6666},
{0x9999,0x9999,0x9999,0x9999},
{0xFFFF,0xFFFF,0xFFFF,0xFFFF}
};
因此过程将是:
例如。
// Create blank canvas.
Magick::Image ctx;
ctx.size(Magick::Geometry(4, 4));
{// Build & copy RED channel.
Magick::Image redImage;
redImage.read(4, 4, "R", Magick::ShortPixel, red);
ctx.composite(redImage, 0, 0, Magick::CopyRedCompositeOp);
}
{// Build & copy GREEN channel.
Magick::Image greenImage;
greenImage.read(4, 4, "G", Magick::ShortPixel, green);
ctx.composite(greenImage, 0, 0, Magick::CopyGreenCompositeOp);
}
{// Build & copy Blue channel
Magick::Image blueImage;
blueImage.read(4, 4, "B", Magick::ShortPixel, blue);
ctx.composite(blueImage, 0, 0, Magick::CopyBlueCompositeOp);
}
ctx.sample(Magick::Geometry(200, 200)); // Enlarge so we can see the results.
ctx.write("output.png");
当然,您可以完全消除这种情况,只需分配一个1d数组,构建“ RGB”栅格,然后调用Magick::Image.read
即可。
size_t
x,
y,
i,
width = 4,
height = 4;
uint16_t raster[width * height * 3];
for(y = 0, i = 0; y < height; ++y) {
for(x = 0; x < width; ++x) {
raster[ i++ ] = red[y][x];
raster[ i++ ] = green[y][x];
raster[ i++ ] = blue[y][x];
}
}
Magick::Image ctx(4, 4, "RGB", Magick::ShortPixel, raster);
YMMV