WPF BitmapImage和带CMYK + Alpha的TIFF

时间:2010-11-01 12:22:26

标签: wpf tiff alpha bitmapimage cmyk

我正在使用此代码段加载各种图像文件:

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文件的示例here

编辑:我无法再重现此问题,以下代码运行正常:

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;

有没有官方的方式来接触他们,而不诉诸反思?

3 个答案:

答案 0 :(得分:0)

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

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

因此,在开业之前进行转换可能是一种安全的方式。

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

HTH。

答案 1 :(得分:0)

这只是猜测,但GDI +可能会加载这些文件。

System.Drawing.Image等。

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

答案 2 :(得分:0)

我在SO上发现了另一个与此库相关的问题:

http://freeimage.sourceforge.net/

Good Tiff library for .NET

我希望这可能有所帮助。