2011-10-11 96 views
2

我通過Magick ++ API鏈接到ImageMagick。我試圖將uint16數據輸出爲1024x768 1通道16位灰度PNG。我從下面得到的輸出是RGB8 PNG。除格式化之外,圖像內容是正確的。ImageMagick C++ API輸出16位灰度png?

gray16_view_t u16view = ...; 
uint16_t* data = interleaved_view_get_raw_data(u16view); 
size_t length = sizeof(u16) * u16view.width() * u16view.height(); 
Magick::Blob u16Blob(data, length); 
Magick::Geometry size(u16view.width(), u16view.height()); 
Magick::Image u16MagickImg(u16Blob, size, 16, "GRAY"); 
u16MagickImg.write("test-16bit.png"); 

有沒有什麼方法可以指定更多關於輸出格式?

的ImageMagick的PNG處理一些討論是在這裏:http://www.imagemagick.org/Usage/formats/#png_formats 他們列出PNG8,PNG24和PNG32爲可用的格式,但下面的部分意味着

-define png:bit-depth 16 
-define png:color-type=0 

在命令行上會具有所需的輸出

回答

1
u16MagickImg.quality(00); 
    u16MagickImg.defineSet("png:color-type", "0"); 
    u16MagickImg.defineSet("png:bit-depth", "16"); 
0

我試圖defineSet,並沒有爲我工作,但接下來的工作:

image.defineValue("png", "format", "png24"); 

我的情況就不同了一下,讓我用不同的PNG格式說明和價值,你的情況在這裏應該是:

u16MagickImg.defineValue("png", "color-type", "0"); 
u16MagickImg.defineValue("png", "bit-depth", "16"); 

見格式說明列表在這裏: http://www.imagemagick.org/script/command-line-options.php#define

見的信息 http://www.imagemagick.org/Magick++/Image.html

從那裏行情:

的Image類在這裏defineValue和defineSet方法意義

defineValue:「設置或獲取要在編碼或解碼指定格式時應用的定義字符串。定義的含義是格式特定的。格式由magick_參數指定,格式特定的鍵由key_指定,關聯的值由value_指定。 如果必須完全刪除密鑰,請參閱defineSet()方法。 「」 defineSet:「設置或獲取定義標誌以在編碼或解碼指定格式時應用。與defineValue()方法類似,不同之處在於傳遞flag_值」true「會創建一個無值定義,並使用該格式和鍵。傳遞flag_值'false'會刪除任何現有的匹配定義。如果存在匹配關鍵字,則該方法返回「真」;如果不存在匹配關鍵字,則返回「假」。

此外,還有一些來自png.c源文件的重要信息: 如果圖像無法無損寫入請求的位深度和顏色類型,PNG文件將不會寫入,將發出警告,並且編碼器將返回MagickFalse。

我不是專家,不確定它會在您的特定情況下工作,但上面的代碼實際上是在OS X ImageMagick 10.6.9上爲我工作的。

希望這會有所幫助