WPF中的BitmapImage和带有CMYK + Alpha通道的TIFF

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#中或通过一些Interop代码进行,但最好不要使用第三方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通道编码的?当查看“格式”属性时,我只获得该图像每像素40位的信息。所有有趣的东西都存储在以下非公共属性中:
bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha;
bitmap.Format.HasAlpha == true;

有没有官方的方法可以获取它们,而不必使用反射?


你有没有任何链接到使用带有Alpha通道的CMYK格式的TIFF文件,出现了这个问题?我无法复制这个问题。 - Fredrik Hedblad
我在问题中添加了一个指向我的TIFF图像的链接(http://www.opac.ch/files/cmyka.tif)。 - Pierre Arnaud
啊,你说得对。抱歉,完全没注意到。 - Fredrik Hedblad
也许我完全误解了这个问题,但是使用您发布的代码,cmyka.tiff可以很好地加载,并且我能够在“Image”中显示它,没有任何异常。 - Fredrik Hedblad
@Maleak:我刚刚再试了一次,现在可以加载TIFF CMYK+A图像了。这真的很奇怪。也许是某个自动的Windows更新修复了这个问题,而我没有注意到?可能吧。 - Pierre Arnaud
我在使用反编译工具Reflector查看了BitmapImagePixelFormat,并没有发现除了使用反射获取这些值之外的其他方法。这会成为你的应用程序可能遇到的瓶颈吗? - Fredrik Hedblad
3个回答

0

我只能这么说,因为我曾经遇到过一些文件的问题:最好先将tiff转换为png24,然后再加载它。

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

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

也许http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx可以做到,但我怀疑,你可能需要一些额外的处理。

希望对你有所帮助。


转换图像无法正常工作(图像转换器似乎不支持我的CMYK + alpha通道图像)。而且我不想先转换为RGB,因为我真的需要访问每个像素的所有五个组件(青色、洋红色、黄色、黑色和Alpha)。 - Pierre Arnaud
@kyle:我错了,代码是可以运行的。我不知道之前为什么会出现异常。 - Pierre Arnaud
很高兴听到这个消息。好的,老式重建全部。 - keyle

0

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

System.Drawing.Image等。

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


我还没有找到如何做到这一点。据我所知,GDI+总是向我返回RGB值,而没有办法获取原始的CMYK值。或者我错了吗? - Pierre Arnaud
实际上我不知道。我只是用这种方法从 TWAIN 中获取图像并在 WPF 中显示它们。 - matthias.lukaszek

0

1
谢谢,但我来自FreeImage,不想回去了;当内存不足时,我遇到了太多问题。在调用FreeImage时,我的应用程序经常崩溃,很可能是由于内存损坏引起的。但是libtiff.net似乎是一个有趣的替代选择。 - Pierre Arnaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接