gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:27:22 25 4
gpt4 key购买 nike

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

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

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

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


因此,我需要能够执行以下操作:

  • 首先判断是否为16位图片
  • 将 Magick::Image 类读出到一个内存块中,该内存块将映射到一个 u_int16_t 的内存块中

有人可以帮忙吗?

最佳答案

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

要使用简单的 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,XC:black 应使用 0x0000 >。使用 ImageMagick 的 convertidentify 实用程序来创建预期的结果。

# 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

它是什么。

关于c++ - Magick++ C++ 输入 16 位灰度 PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com