Magick++ C++ 输入 16 位灰度 PNG
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,但文档中描述的其他人没有指定它们实际的位大小。
因此,我需要能够执行以下操作:
- 首先判断是否为16位图片
- 将 Magick::Image class 读出到一个内存块中,该内存块将映射到一个内存块中 u_int16_t
有人可以帮忙吗?
有几种方法可以做到这一点,但没有看到 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 canvas 图像以满足 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);
Determine whether it is a 16-bit image in the first place
Magick::Image.depth
可用于识别,设置深度值。
const size_t DEPTH = 16;
if ( magick_image.depth() != DEPTH ) {
magick_image.depth(DEPTH);
}
Read out of the Magick::Image class into a block of memory that would map to place into a block of memory for a 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
的图像 canvas 应该用 0xFFFF
填充 blob,用 0x0000
填充 XC:black
。使用 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
。
它是什么。
我有一系列 PNG 文件,我知道它们是 16 位灰度格式。我用 Magick++ 加载它并以 8 位格式访问数据没有遇到问题(这样做主要是因为所有代码都在那里,不需要更改)。
magick_image->write(0, 0, grey->GetWidth(), grey->GetHeight(), "R", Magick::CharPixel, grey->GetBeginData());
请注意,灰色是在我们自己的图像容器中,但内存布局只是一块预分配内存。
我现在被告知我们需要访问完整的 16 位范围,但我不太确定如何执行此操作。我想我不会使用 Magick::CharPixel,但文档中描述的其他人没有指定它们实际的位大小。
因此,我需要能够执行以下操作:
- 首先判断是否为16位图片
- 将 Magick::Image class 读出到一个内存块中,该内存块将映射到一个内存块中 u_int16_t
有人可以帮忙吗?
有几种方法可以做到这一点,但没有看到 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 canvas 图像以满足 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);
Determine whether it is a 16-bit image in the first place
Magick::Image.depth
可用于识别,设置深度值。
const size_t DEPTH = 16;
if ( magick_image.depth() != DEPTH ) {
magick_image.depth(DEPTH);
}
Read out of the Magick::Image class into a block of memory that would map to place into a block of memory for a 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
的图像 canvas 应该用 0xFFFF
填充 blob,用 0x0000
填充 XC:black
。使用 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
。
它是什么。