2

Magick++ API 経由で ImageMagick にリンクしています。uint16 データを取得して、1024x768 1 チャネル 16 ビット グレースケール PNG として出力しようとしています。以下から得られる出力は RGB8 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 

コマンドラインでは、目的の出力が得られます

4

2 に答える 2

1
    u16MagickImg.quality(00);
    u16MagickImg.defineSet("png:color-type", "0");
    u16MagickImg.defineSet("png:bit-depth", "16");
于 2011-10-11T17:05:46.547 に答える
1

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

ここで Image クラスの defineValue および defineSet メソッドの意味に関する情報を参照してください: http://www.imagemagick.org/Magick++/Image.html

そこからの引用:

defineValue: "指定された形式をエンコードまたはデコードするときに適用される定義文字列を設定または取得します。定義の意味は形式固有です。形式は magic_ 引数で指定され、形式固有のキーは key_ で指定され、関連付けられた値は value_ によって指定されます。キーを完全に削除する必要がある場合は、defineSet() メソッドを参照してください。 " defineSet: "指定された形式をエンコードまたはデコードするときに適用される定義フラグを設定または取得します。 flag_ 値 'true' を渡すと、そのフォーマットとキーで値のない定義が作成されます. flag_ 値 'false' を渡すと、既存の一致する定義が削除されます. 一致するキーが存在する場合、メソッドは 'true' を返し、存在しない場合 'false' を返します一致するキーが存在します。」

png.c ソース ファイルからのいくつかの重要な情報: 要求されたビット深度と色の種類で損失なしに画像を書き込むことができない場合、PNG ファイルは書き込まれず、警告が発行され、エンコーダーは戻ります。 MagickFalse。

私は専門家ではなく、特定のケースで機能するかどうかはわかりませんが、上記のコードは、OS X ImageMagick 10.6.9 で実際に機能したものです。

お役に立てれば。

于 2014-02-27T08:15:54.413 に答える