作为一个python新手,一开始遇到了不少问题,这个问题是我在使用PIL库时出现的,但是在网上没有找到比较好的解决办法,所以在这里mark一下。
在使用PIL中一些常见的“open”,”show”,”save”函数时,代码如下:
>>> from PIL import Image
>>> im=Image.open("test.png")
>>> im.show()
>>> im
521x391 at 0x37D75F8>
>>> im.save("test.bmp")
Traceback (most recent call last):
File "" , line 1, in
im.save("test.bmp")
File "C:\Python27\lib\site-packages\PIL\Image.py", line 1439, in save
save_handler(self, fp, filename)
File "C:\Python27\lib\site-packages\PIL\BmpImagePlugin.py", line 203, in _save
raise IOError("cannot write mode %s as BMP" % im.mode)
IOError: cannot write mode RGBA as BMP
>>>
出现了这个错误。
cannot write mode RGBA as BMP pytesser
im = Image.open(C:\image.png)
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
print image_to_string(bg)
其实这个方案是可行的,但是它没有说清楚,没说为什么可以,所以当时就被我忽略掉了。其实是因为,png图像有RGBA四个通道,而BMP图像只有RGB三个通道,所以PNG转BMP时候程序不知道A通道怎么办,就会产生错误。
我在另外一篇文章中得到了启示。
python Image库的使用
里面有一段转换图像格式的代码:
from PIL import Image
file_in = "test.png"
img = Image.open(file_in)
file_out = "test2.bmp"
print len(img.split()) # test
if len(img.split()) == 4:
#prevent IOError: cannot write mode RGBA as BMP
r, g, b, a = img.split()
img = Image.merge("RGB", (r, g, b))
img.save(file_out)
else:
img.save(file_out)
程序检查通道数,来决定是直接转换成bmp还是丢弃A通道后转换成BMP,说明在含有A通道时,转换会失败。
转换过程如下:
>>> from PIL import Image
>>> im=Image.open("test.png")
>>> r,g,b,a=im.split()
>>> im=Image.merge((r,g,b))
Traceback (most recent call last):
File "" , line 1, in
im=Image.merge((r,g,b))
TypeError: merge() takes exactly 2 arguments (1 given)
>>> im=Image.merge("RGB",(r,g,b))
>>> im.save("test.bmp")
>>>