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 颜色和 Alpha 通道加载 TIFF 文件,则会出现异常(解码器无法将文件格式识别为有效)。

我之前使用的是FreeImage库和一个薄的 C# 包装器。FreeImage 3.x 部分支持这种图像格式,即我必须加载两次 TIFF,一次是不透明的 CMYK,一次是 RGB+Alpha;这个技巧是必要的,因为 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 加 Alpha 通道?查看Format属性时,我只得到图像每像素 40 位的信息。所有有趣的东西都存储在以下非公共属性中:

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

是否有任何官方方法可以在不诉诸反思的情况下找到它们?

4

3 回答 3

0

我只能这样说,因为我遇到了一些文件的问题:首先将 tiff 转换为 png24 然后加载它可能是一种更好的方法。

如果用户尝试保存 CMYK Tiff 文件并勾选“透明度”,即使 Photoshop 也会发出警告:“许多程序不支持 TIFF 中的透明度。保存透明度信息?”

因此,在打开之前转换可能是安全的方法。

也许http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx会这样做,但我对此表示怀疑,您可能需要一些额外的管道。

HTH。

于 2011-01-31T07:09:33.740 回答
0

这只是一个猜测,但 GDI+ 可能能够加载此类文件。

System.Drawing.Image 等

有一个互操作类可以在 WPF 中呈现 GDI+ 图像。

于 2011-01-31T21:44:51.003 回答
0

我在链接到这个库的 SO 上发现了另一个问题:

http://freeimage.sourceforge.net/

.NET 的好 Tiff 库

我希望这可能会有所帮助。

于 2011-02-04T10:08:07.397 回答