有几种方法可以做到这一点,但没有看到magick_image
&的定义grey
,这个答案是基于一些假设。
要使用 bare-bone 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
填充 blob 。使用 ImageMagick 的&实用程序来创建预期的结果。0xFFFF
XC:black
0x0000
convert
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
。

它是什么。