我正在使用此代码段加载各种图像文件:
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;
有没有官方的方式来接触他们,而不诉诸反思?
答案 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)