我有图像,有System.Drawing.Imaging.PixelFormat.Format1bppIndexed
(在Windows资源管理器文件属性中查看)。
但加载文件后,看到Format32bppArgb
:
string path = "cat.png";
using (var bitmap = new System.Drawing.Bitmap(path))
{
// bitmap.PixelFormat == Format32bppArgb, but must Format1bppIndexed
}
可能是什么问题?
测试图片1 :http://i.stack.imgur.com/r2HGH.png
测试图片2 :http://i.stack.imgur.com/xUgEy.png
UPD
尝试使用构造函数
// useIcm:
// true to use color correction for this System.Drawing.Bitmap; otherwise, false.
Bitmap(string filename, bool useIcm);
测试图像1加载成功,但测试图像2有Format32bppArgb
答案 0 :(得分:0)
运行Bitmap
构造函数时,它会解析图像文件并将其加载到对象中。您所看到的不是文件的PixelFormat
,而是对象的PixelFormat
。构造函数正在内部将格式转换为Format32bppArgb
。
答案 1 :(得分:0)
原始图像的像素格式是什么并不重要。它取决于解码器是否保留原始像素格式。如果您确实要将双色图像转换为1 bpp格式,请参阅我的答案here中的ConvertPixelFormat
方法。
答案 2 :(得分:0)
这是.Net框架中的一个错误;它似乎与透明度在调色板png图像上的工作方式有关。
请参阅调色板png图像实际上是完全支持alpha的,在调色板级别上。 png文件有一个特定的额外块(" tRNS"块),可以添加它以定义每个调色板条目的alpha。不知何故,遇到这种情况时,.Net框架正确地应用了这个alpha,但后来坚持将图像视为32bppARGB。
这很奇怪,因为它完全支持调色板上的alpha,就像和实际上保存这样的文件没有任何问题。
特别奇怪的是,你所拥有的文件在其调色板上实际上具有透明度; " tRNS" chunk将所有调色板条目定义为100%不透明。但似乎只有拥有块就足够了。
解决方法是将png加载到字节数组中,读取并删除" tRNS"包含透明度数据的块,以便.Net框架保留索引格式,并且在从编辑的字节数组创建的流中加载图像后,使用读取" tRNS"要应用alpha的数据。
这个完整的代码发布在这个答案中:
A: Loading an indexed color image file correctly
顺便说一下,对png块的分析表明,第二个图像实际上是每像素一位的图像,具有 256色的调色板。不知道你是怎么做到的。