如何可视化数组数据?

How to visualize arrays data?

我有三个二维数组,它们具有一定的大小和一些 uint16_t rgb 值。因此,当这些数组完全充满数据时(我将它们一起填充,所以它是同时发生的)我必须使用 PNG 或 JPG 图像格式可视化这些数组,保存它,然后再次开始用新数据填充数组。我正在考虑为每种颜色创建具有 3 个字段的结构向量,mb 使用此数据结构将更容易处理此任务。有人可以告诉我,最好的方法是什么?

提前致谢。

如果你使用 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_);

这将允许您从内存地址任意读取光栅数据;前提是您定义大小(宽度和高度)、通道映射和存储大小。

I have three 2-dimensional arrays with a certain size and some uint16_t values for rgb.

我会推荐 "importing" 每个阵列到单个 临时 图像,并将每个颜色通道合成复制到最终图像中。

没有看到你的代码,我猜你定义了这样的东西...

// 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}
    };

所以过程将是:

  1. 为最终图像创建空白 canvas。
  2. 将每个二维数组加载到临时栅格中。
  3. 合成 - 将临时光栅复制到最终图像。
  4. 根据需要重复。

例如..

// 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");

当然,您可以通过分配一维数组、构建 "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