簡體   English   中英

如何使用CImg檢索已加載CImg的圖像的色彩空間?

[英]How do you retrieve the colour space with CImg of an image loaded with CImg?

我正在用CIMG加載圖像,如下所示:

CImg<unsigned char> image("lena.png");

我怎么知道該圖像的例如四個通道代表RGBA顏色而不是CMYK? 我知道CImg<>::spectrum()為我提供了通道數量,但即使文檔中也說: “像素值的含義與通道數量沒有關系(例如4通道圖像可能無意中代表了RGBA或CMYK彩色圖像)”

我已經搜索了文檔和教程,但是似乎沒有任何功能可以告訴我頻道數據的含義。

那么,我如何知道正在使用的數據類型? 我是否可以僅假設所有新加載的圖像均為RGB或RGBA?

如果您的圖片為PNG格式,則必須為RGB或RGBA,因為PNG不支持CMYK。

如果是JPEG,我會假設它是sRGB色彩空間,但是您可以先使用ImageMagick進行檢查,方法是:

identify -format "%[colorspace]" YourImage.xxx

我使用Imagemagick生成了CMYK圖像,並使用CImg加載了它。 由於色彩空間的緣故,它似乎不執行任何轉換,而僅將每個像素的第一個字節返回為紅色(實際上是青色),第二個返回為綠色(雖然是洋紅色),依此類推...

我還使用調試信息編譯了CImg ,並將cimg_use_jpeg定義為1 (因此它使用libjpeg )並逐步執行。 可以在函數_load_jpeg中的jpeg_info_struct中看到該圖像是CMYK,但是它忽略了此信息-我想您可以修補CImg並很容易地修改全局變量以存儲色彩空間-如果您喜歡黑客! 或者,您可以通過CImg GitHub頁面請求DavidTschumperlé這樣做,他確實對此進行了回復...

在此處輸入圖片說明


這是一個可能的解決方法。 如果您不使用cimg_use_jpegcimg_use_pngcimg_use_tiff ,則CImg會將讀取文件委托給ImageMagick的名為convert的命令行工具。 然后它將圖像轉換為PNM格式(在管道中,不在磁盤上), CImg將從管道中讀取數據。 至關重要的是, ImageMagick始終將以 PNM格式寫入的圖像轉換為sRGB色彩空間,因此,如果您有ImageMagick轉換圖像(通過不使用CImg的內置庫),則您的圖像將始終以sRGB色彩空間讀取。 本質上, CImg這樣做是在委派給ImageMagick時讀取文件:

convert input.jpg pnm:-

並讀取輸出。

你會注意到,你的4通道(以前CMYK)圖像突然變得時CIMG已授權ImageMagick的 3通道(現在的sRGB)圖像,因為從ImageMagick的輸出是一個必然3通道,PNM文件。


如果您想走得更遠...

如果設置環境變量,則可以控制CImg哪里尋找convert ,因此可以將其指向真正的ImageMagick convert周圍的自己的“包裝器”

因此,具體來說,如果您這樣做:

export cimg_convert_path="/Users/YourUser/bin/convertWrapper"

在其中運行任何帶有CImg的程序之前或在程序開始時,執行以下操作:

setenv("cimg_convert_path","/Users/YourUser/bin/convertWrapper",1);

CImg將運行以下命令來加載文件:

/Users/YourUser/bin/convertWrapper input.jpg pnm:-

因此,我建議在該包裝文件中,您可以修改傳遞來進行convert的參數,以便它實際執行其他操作:

convert input.jpg -auto-level pnm:-

因此, convertWrapper將包含:

#!/bin/bash

# Pick up arguments and put in array
args=( "$@" )

# Remove last argument ("pnm:-")
unset 'args[${#args[@]}-1]'

# Add our "-auto-level" parameter in before last item
args+=("-auto-level")

# Re-append "pnm:-"
args+=("pnm:-")

# Debug output to /tmp/a
echo "BEFORE: $@"         >> /tmp/a
echo "AFTER:  ${args[@]}" >> /tmp/a

# Call real "convert" with modified parameters
/usr/local/bin/magick "${args[@]}"

這種方法意味着您不需要修改CImg

暫無
暫無

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

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