簡體   English   中英

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類中讀取出一個內存塊,該內存塊將映射到u_int16_t的內存塊中

有人能幫忙嗎?

有幾種方法可以執行此操作,但是在沒有看到magick_imagegrey的定義的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的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位灰度PNG

是的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM