このコード スニペットを使用して、さまざまな画像ファイルをロードしています。
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;
リフレクションに頼らずに、それらにたどり着く公式の方法はありますか?