有没有办法在PIL中指定颜色(用于绘制多边形)而不会出错?

时间:2018-07-11 06:27:40

标签: python python-imaging-library pillow

编辑:为了清楚起见,我们将其完全重写,仅关注我遇到的问题:

我从网上下载了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文件上绘制一个多边形。

0 个答案:

没有答案