Magick ++ C ++输入16位灰度PNG

时间:2015-05-06 10:52:52

标签: c++ c++11 magick++

我有一系列PNG文件,我知道它是16位灰度格式。我没有遇到使用Magick ++加载它并以8位格式访问数据的问题(这主要是因为所有代码都在那里而且不需要进行任何更改)。

magick_image->write(0, 0, grey->GetWidth(), grey->GetHeight(), "R", Magick::CharPixel, grey->GetBeginData());

请注意,灰色在我们自己的图像容器中,但内存布局只是预分配内存的一个块。

我现在被告知我们需要访问完整的16位范围,而且我不太清楚如何做到这一点。我认为我不会使用Magick :: CharPixel,但文档中描述的其他内容并未指定实际的位大小。

所以,我需要能够做以下事情:

  • 首先确定它是否是16位图像
  • 将Magick :: Image类读出到一个内存块中,该内存块将映射到u_int16_t的内存块中

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点,但没有看到magick_image&的定义。 grey,这个答案基于一些假设。

要使用裸骨grey,我认为可以将其定义为......

struct MaybeGray {
    std::vector<u_int16_t> blob;
    size_t width;
    size_t height;
    MaybeGray(size_t w, size_t h) : blob(w * h) { width = w; height = h; };
    size_t getWidth() { return width; };
    size_t getHeight() { return height; };
    void * getBeginData() { return blob.data(); } // C11? Is this allowed?
};

接下来,我将创建一个2x2画布图像以满足magick_image

Magick::Image magick_image;
Magick::Geometry size(2, 2);
magick_image.size(size);
magick_image.read("XC:blue");
// Apply gray scale (Magick::Image.quantize may be better.)
magick_image.type(Magick::GrayscaleType);
  

首先确定它是否是16位图像

Magick::Image.depth可用于识别和设置深度值。

const size_t DEPTH = 16;
if ( magick_image.depth() != DEPTH ) {
    magick_image.depth(DEPTH);
}
  

将Magick :: Image类读出到一个内存块中,该内存块将映射到u_int16_t的内存块中

您使用Magick::Image.write做的事情是正确的。但是Magick::CharPixel将是8位,256色,深度。对于16位,请使用Magick::ShortPixel

struct MaybeGray gray(2, 2);
magick_image.write(0, 0,
                   gray.getWidth(),
                   gray.getHeight(),
                   "R",
                   Magick::ShortPixel,
                   gray.getBeginData());

如何测试

XC:red的图片画布应使用0xFFFF填充blob,XC:black填充0x0000。使用ImageMagick的convert&amp; identify实用程序可以创建预期的结果。

# Create identical canvas
convert -size 2x2 xc:blue -colorspace gray -depth 16 blue.tiff
# Dump info
identify -verbose blue.tiff

  Image: blue.tiff
  Format: TIFF (Tagged Image File Format)
  Class: DirectClass
  Geometry: 2x2+0+0
  Units: PixelsPerInch
  Type: Grayscale
  Base type: Grayscale
  Endianess: LSB
  Colorspace: Gray
  Depth: 16/14-bit
  Channel depth:
    gray: 14-bit
  Channel statistics:
    Gray:
      min: 4732 (0.0722057)
      max: 4732 (0.0722057)
      mean: 4732 (0.0722057)
      standard deviation: 0 (0)
      kurtosis: 0
      skewness: 0
  Colors: 1
  Histogram:
         4: ( 4732, 4732, 4732) #127C127C127C gray(7.22057%)
  # ... rest omitted

详细信息确认我有16位灰色图像,直方图通知我MaybeGrey.blob将填充4 0x127C

16-bit Greyscale PNG

它是什么。

相关问题