为什么Photoshop打不开用GDI+生成的jpeg文件

近日,在用c#做一个桌面软件的时候发现了一个奇怪的现象:用.net framework 2.0中的GDI+的System.Drawing.Bitmap的Save方法保存的jpeg图片不能被photoshop读取,但是WinXP的资源管理器和画图版均能显示或编辑这幅图片,这是怎么回事呢?

 
我在程序中用GDI+中的System.Drawing.Bitmap的一个实例对象的Save方法将图片保存成磁盘上的文件,使用了以下的代码:
 
Bitmap img = new Bitmap(width, height);
…(在这个Bitmap上绘图)
img.Save(“c://a.jpg”);
 

运行程序过后,C盘根目录下成功生成了a.jpg这幅图片,资源管理器里也正确显示了a.jpg的缩略图。但当用photoshop编辑的时候,它却显示了一条错误信息”Could not complete your request because an unknown or invalid JPEG marker type is found”并拒绝打开这幅图片。

 
这个问题很奇怪,photoshop声称这幅图片编码错误,但windows却能打开这幅图片,这是怎么回事呢?我试探性地用windows自带的画图板打开,没问题。画两笔,也没问题,另存为…,这时候问题来了,在另存为对话框中,windows建议的文件名后缀竟然是png !
 
到了此时,我恍然大悟:原来在哪里看到过,windows对于图片文件的解码不是通过后缀名来识别,而是通过图片头,尤其是不同图片类型的magic number来识别的。而photoshop,通过它的表现看来,显然是通过后缀名的不同使用不同的图片解码器。虽然这是一个披着jpg外衣(扩展名jpg)的png文件(实际文件内容是png格式),但windows并不抱怨,直接打开了事。
 
问题找到了,解决方案就有了,把上面保存的代码改成:
 
img.Save(“c://a.jpg”,System.Drawing.Imaging.ImageFormat.Jpeg);
 
就好了。
 
 
由这件事情,总结出几点值得注意的:
 
1、 GDI+中的System.Drawing.Bitmap的Save方法默认保存文件类型是png,不能想当然地认为你给它一个什么后缀的文件名它就能帮你保存成什么文件,如果要保存jpeg或bmp格式,一定要明确指定。
2、 GDI+和Windows配合的简直天衣无缝:一个一言不发地帮你保存成png格式,另一个瞒天过海,装作打开一个jpg文件一样帮你把这个png打开,如果你只用windows和画图板,一时还真发现不了问题。
3、 联想到网上有许多人问:为啥我收到个jpg文件photoshop打不开呀?试试用windows画图板打开,然后另存为…,它就会把真正的文件类型告诉你,接下来嘛,就迎刃而解了。
 

没有更多推荐了,返回首页