刚开始研究图片的基本操作,在图片保存位深度上折腾了2天都未果,找遍所有资料,都没有很好的解决png文件在保存时正确保存位深度。
我想图片保存都是调用的Image.Save方法吧,Bitmap是继承Image的,所以一样。该方法的参数里虽然可以调整保存的位深度,但是使用无效。于是我想办法先将图片本身的位深度改变,然后保存。的确,这样保存是有效果的,因为文件大小不同了,但是查看图片属性的话,还是32位的,并没有变化,这样就存在一个问题:当我再次读取这个图片时,获取其位深度信息就是32位的,其实内部用到的颜色并非32位的,变成了我用高的位深度来存储低位深度保存的图片,再次保存就会使图片体积变大,很变态啊。
后来找到了一个方法,参考如下:
MemoryStream ms = new MemoryStream();
img1.Save(ms, ImageFormat.Bmp);
var img2 = Image.FromStream(ms);
先将img1以bmp格式保存到内存流,然后读取回来,用img2保存到文件中,这样文件的位深度就正确了。
为什么要绕个弯呢,不能直接保存正确呢?我想可能是微软的BUG,于是我下载了微软免费绘图软件PAINT.NET,看看它保存的时候是不是也这样。结果果然被我猜中了,它保存为png文件时,第一次还是显示的32位的,不过第二次重新保存能够正常,虽然不知道这个第二次的原理为何物,但至少说明了这个Image.Save方法存在BUG。
关于正确保存png文件的位深度,如有高见,亦可发表各自的建议。