编辑:为了清楚起见,我们将其完全重写,仅关注我遇到的问题:
我从网上下载了png格式的卫星照片。我保存它,然后将其重新加载到PIL Image对象中。无论如何,当我尝试指定颜色以便在图像上绘制多边形时,PIL会崩溃。
这是我加载图像并尝试在其上绘制的地方:
from PIL import Image, ImageColor, ImageDraw
PILimage = Image.open(pngfile)
allpoints = coordinates16.split(',');
allpoints = [int(n) for n in coordinates16.split(",")]
draw = ImageDraw.Draw(PILimage)
draw.polygon(allpoints, fill=None, outline='red')
PILimage.save(pngfile, "png")
(coordinates16是一个逗号分隔的字符串,具有多个(x,y)坐标,因此我将其拆分为整数列表。)
当我使用此代码时,如果我没有为绘制多边形指定任何轮廓颜色,则一切正常。但是当我指定颜色时,得到的是:
Traceback (most recent call last):
File "../HalPy/LandSearch/GetOurLotMap.py", line 140, in <module>
getmap(latitude, longitude, defaultmapfile)
File "../HalPy/LandSearch/GetOurLotMap.py", line 122, in getmap
draw.polygon(allpoints, fill=None, outline='red')
File "/Library/Python/2.7/site-packages/PIL/ImageDraw.py", line 236, in polygon
ink, fill = self._getink(outline, fill)
File "/Library/Python/2.7/site-packages/PIL/ImageDraw.py", line 145, in _getink
ink = self.palette.getcolor(ink)
File "/Library/Python/2.7/site-packages/PIL/ImagePalette.py", line 62, in getcolor
self.palette = map(int, self.palette)
ValueError: invalid literal for int() with base 10: '\x06'
即使我指定了不同的颜色,最后一行('\ x06')中的最后一个值也是相同的。
请注意,在我的第一个版本的评论中,@ Aankhen指出了一个带有PNG文件的bug in PIL。尽管该错误指定在打开PNG时会发生此错误,但它会在库中的同一函数中发生。
考虑到这一点,我认为它应该与其他格式一起使用会更好,因此我对代码进行了更改。我将PNG文件保存为BMP文件,然后将其重新加载为BMP文件:
from PIL import Image, ImageColor, ImageDraw
PILimage = Image.open(pngfile)
PILimage.save(bmpfile, "bmp")
PILimage = Image.open(bmpfile)
allpoints = coordinates16.split(',');
allpoints = [int(n) for n in coordinates16.split(",")]
draw = ImageDraw.Draw(PILimage)
draw.polygon(allpoints, fill=None, outline='red')
PILimage.save(pngfile, "png")
通过在第二行之后添加两行来记录更改。打开PNG文件后,我立即将其另存为BMP文件。然后,我将其重新加载为新对象,现在为BMP格式。在那之后,我做与以前相同的事情,希望避免该错误。我运行它并得到:
Traceback (most recent call last):
File "../HalPy/LandSearch/GetOurLotMap.py", line 140, in <module>
getmap(latitude, longitude, defaultmapfile)
File "../HalPy/LandSearch/GetOurLotMap.py", line 122, in getmap
draw.polygon(allpoints, fill=None, outline='red')
File "/Library/Python/2.7/site-packages/PIL/ImageDraw.py", line 236, in polygon
ink, fill = self._getink(outline, fill)
File "/Library/Python/2.7/site-packages/PIL/ImageDraw.py", line 145, in _getink
ink = self.palette.getcolor(ink)
File "/Library/Python/2.7/site-packages/PIL/ImagePalette.py", line 62, in getcolor
self.palette = map(int, self.palette)
ValueError: invalid literal for int() with base 10: '\x02'
同样,当我更改为轮廓指定的颜色时,末尾的值不会更改。 (尽管我注意到这与使用PNG格式时的值有所不同。)
有什么方法可以为轮廓指定值而不会出现错误?我不介意转换格式(但我避免转换为任何有损格式),但是我主要担心的是,要指定没有错误的颜色似乎是不可能的。
我什至会很高兴使用另一个库。我要做的就是在PNG文件上绘制一个多边形。