5

このコード スニペットを使用して、さまざまな画像ファイルをロードしています。

BitmapImage bitmap = new BitmapImage ();
bitmap.BeginInit ();
bitmap.UriSource = new System.Uri (path);
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit ();

これは、RGB、RGB+Alpha、および CMYK として保存された TIFF ファイルでは問題なく機能します。ただし、CMYK カラーとアルファ チャネルを使用して TIFF ファイルを読み込もうとすると、例外が発生します (ファイル形式がデコーダによって有効であると認識されません)。

私は以前、FreeImageライブラリとその上に薄い C# ラッパーを使用していました。FreeImage 3.x は、この種の画像フォーマットを部分的にサポートしています。つまり、TIFF を 2 回ロードする必要がありました。FreeImage は同時に最大 4 つのカラー チャンネルにしかアクセスできないため、このトリックが必要です。

CMYK+Alpha ビットマップをロードするサポートされている方法があるかどうかを知りたいですか? C# で直接、または何らかの相互運用コードを使用しますが、できればサードパーティの DLL (.NET 4 フレームワーク ライブラリ以外) を使用する必要はありません。

このような TIFF ファイルの例は、ここにあります。

編集:問題を再現できなくなりました。次のコードは問題なく動作します:

BitmapImage bitmap = new BitmapImage ();
bitmap.BeginInit ();
bitmap.UriSource = new System.Uri (path);
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit ();
byte[] pixels = new byte[bitmap.PixelHeight*bitmap.PixelWidth*5];
bitmap.CopyPixels (pixels, bitmap.PixelWidth * 5, 0);

ソース イメージが CMYK とアルファ チャネルとしてエンコードされていることを確認するにはどうすればよいですか? プロパティを見るとFormat、画像のピクセルあたりのビット数が 40 であるという情報しか得られません。興味深いものはすべて、次の非公開プロパティに格納されています。

bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha;
bitmap.Format.HasAlpha == true;

リフレクションに頼らずに、それらにたどり着く公式の方法はありますか?

4

3 に答える 3

0

推測にすぎませんが、GDI+ はそのようなファイルをロードできる可能性があります。

System.Drawing.Image など

WPF で GDI+ イメージをレンダリングできる相互運用クラスがあります。

于 2011-01-31T21:44:51.003 に答える
0

一部のファイルで問題が発生したため、これしか言えません。最初に tiff を png24 に変換してからロードする方が良いかもしれません。

Photoshop でさえ、ユーザーが CMYK Tiff ファイルを保存しようとして「透明度」にチェックを入れると、「多くのプログラムは TIFF の透明度をサポートしていません。透明度情報を保存しますか?」という警告を出します。

したがって、開く前に変換するのが安全な方法かもしれません。

多分http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspxがそれを行うでしょうが、私はそれを疑っています.おそらく追加の配管が必要です.

HTH。

于 2011-01-31T07:09:33.740 に答える
0

このライブラリにリンクされているSOに関する別の質問を見つけました:

http://freeimage.sourceforge.net/

.NET 用の優れた Tiff ライブラリ

これが役立つことを願っています。

于 2011-02-04T10:08:07.397 に答える