[英]Magick++ C++ Input 16-bit Greyscale PNG
我有一系列的PNG文件,这些文件都是16位灰度格式。 我使用Magick ++加载并以8位格式访问数据没有问题(这样做主要是因为所有代码都在那里,无需更改)。
magick_image->write(0, 0, grey->GetWidth(), grey->GetHeight(), "R", Magick::CharPixel, grey->GetBeginData());
请注意,灰色在我们自己的图像存储容器中,但是内存布局只是一个预先分配的内存块。
现在有人告诉我,我们需要访问整个16位范围,但我不太确定该怎么做。 我想我不会使用Magick :: CharPixel,但是文档中描述的其他对象并没有指定它们实际的位数。
因此,我需要能够执行以下操作:
有人能帮忙吗?
有几种方法可以执行此操作,但是在没有看到magick_image
和grey
的定义的magick_image
,此答案基于一些假设。
要使用准骨灰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
填充斑点,而XC:black
则应使用0x0000
填充斑点。 使用ImageMagick的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
。
是的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.