我正在使用这段代码片段来加载各种图像文件:
这对于存储为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文件示例可以在此处找到。
编辑:我无法再现问题,以下代码完美运行:
但我还是卡住了:我怎么知道源图像是作为CMYK加Alpha通道编码的?当查看“格式”属性时,我只获得该图像每像素40位的信息。所有有趣的东西都存储在以下非公共属性中:
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;
有没有官方的方法可以获取它们,而不必使用反射?
BitmapImage
和PixelFormat
,并没有发现除了使用反射获取这些值之外的其他方法。这会成为你的应用程序可能遇到的瓶颈吗? - Fredrik Hedblad