我有一系列PNG文件,我知道它是16位灰度格式。我没有遇到使用Magick ++加载它并以8位格式访问数据的问题(这主要是因为所有代码都在那里而且不需要进行任何更改)。
magick_image->write(0, 0, grey->GetWidth(), grey->GetHeight(), "R", Magick::CharPixel, grey->GetBeginData());
请注意,灰色在我们自己的图像容器中,但内存布局只是预分配内存的一个块。
我现在被告知我们需要访问完整的16位范围,而且我不太清楚如何做到这一点。我认为我不会使用Magick :: CharPixel,但文档中描述的其他内容并未指定实际的位大小。
所以,我需要能够做以下事情:
任何人都可以帮忙吗?
答案 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
。
它是什么。