为什么不能将Image.putpixel()视为更改大量像素颜色的好选择?

时间:2019-07-15 18:36:57

标签: python python-imaging-library

Image.putpixel()的文档中指出:-

  

修改给定位置的像素。对于单波段图像,颜色是单个数值,对于多波段图像,颜色是元组。

     

请注意,此方法相对较慢。要进行更广泛的更改,请改用paste()ImageDraw模块。

很明显,文档指出此方法相对,如果图像中的更改数量很大,则应考虑其他方法。

但是没有明确的原因,为什么?

我尝试对putpixel()方法进行源代码分析,但无法推断出任何内容。

putpixel()的来源:-

def putpixel(self, xy, value):

    if self.readonly:
        self._copy()
    self.load()

    if self.pyaccess:
        return self.pyaccess.putpixel(xy, value)

    if self.mode == "P" and isinstance(value, (list, tuple)) and len(value) in [3, 4]:
        # RGB or RGBA value for a P image
        value = self.palette.getcolor(value)
    return self.im.putpixel(xy, value)

P.S。:-:我想知道Image.getpixel()(与putpixel()相对的方法)是否也遭受相同的缺点?正如其文档中未提到的那样。

1 个答案:

答案 0 :(得分:0)

如果您想要六个苹果,那么一次去商店购买六个苹果要比去商店六次并每次购买一个苹果要快得多。设置像素也是如此。

看看putpixel方法在做什么:

  1. 它会进行各种检查,例如图像是否为只读图像,实现是否使用pyaccess以及图像使用哪种颜色模式
  2. 它可以检查并验证像素数据的类型和尺寸
  3. self.im.putpixel无疑对坐标做了相同的操作,并且乘以倍数来找到偏移量
  4. 最后它可以执行实际操作:设置四个字节的像素数据。

这是许多操作,属性访问和方法调用,仅需很小的操作。如果您多次调用putpixel,它将每次重复所有这些操作。

如果您要求它同时做多个像素,则可以跳过下一个像素的步骤1-3,因为它是相同的。