Pie*_*aud 5 wpf alpha tiff cmyk bitmapimage
我正在使用此代码段来加载各种图像文件:
BitmapImage bitmap = new BitmapImage ();
bitmap.BeginInit ();
bitmap.UriSource = new System.Uri (path);
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bitmap.EndInit ();
Run Code Online (Sandbox Code Playgroud)
这适用于存储为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);
Run Code Online (Sandbox Code Playgroud)
但我仍然陷入困境:如何才能发现源图像被编码为CMYK加Alpha通道?查看Format属性时,我只获得图像每像素40位的信息.所有有趣的东西都存储在以下非公共属性中:
bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha;
bitmap.Format.HasAlpha == true;
Run Code Online (Sandbox Code Playgroud)
有没有任何正式的方式来接触他们,而不诉诸反思?
我只能这么说,因为我遇到了一些文件的问题:首先将 tiff 转换为 png24 然后加载它可能是更好的方法。
如果用户尝试保存 CMYK Tiff 文件并勾选“透明度”,甚至 Photoshop 也会发出警告:“许多程序不支持 TIFF 透明度。保存透明度信息吗?”
因此,在开业之前进行转换可能是安全的方法。
也许http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx可以做到这一点,但我对此表示怀疑,你可能需要一些额外的管道。
HTH。