PIL:如果之前调整了图像大小,则更改颜色不一致

时间:2015-07-27 21:53:00

标签: image python-3.x colors tkinter python-imaging-library

我希望能够在调整大小后重新着色图像,因为如果我这样做之前需要太长时间,因为原件太大了。 代码: 快,但不好:

img = Image.open("piimage.png")        
img = img.resize((30,30), Image.ANTIALIAS)
pixdata = img.load()
for y in range(img.size[1]):
    for x in range(img.size[0]):
        if pixdata[x, y] == (255, 255, 255, 255):
            pixdata[x, y] = (0, 0, 0, 255)
self.piimage = ImageTk.PhotoImage(img)

慢,但很好:

img = Image.open("piimage.png")
pixdata = img.load()
for y in range(img.size[1]):
    for x in range(img.size[0]):
        if pixdata[x, y] == (255, 255, 255, 255):
            pixdata[x, y] = (0, 0, 0, 255)        
img = img.resize((30,30), Image.ANTIALIAS)
self.piimage = ImageTk.PhotoImage(img)

我在stackoverflow上找到了这个代码,但是这个示例没有调整大小,但我需要它,因为我将它们用于小按钮。上限和下限之间的唯一区别是resize命令的位置。 为什么会发生这种情况以及如何解决这个问题? 图像显示结果: enter image description here

2 个答案:

答案 0 :(得分:0)

使用ANTIALIAS调整大小后,白色像素不再是白色。因此,您的if声明不应再过于严格。更好的是将其改为:

white_threshold = 208
if pixdata[x, y][0] <= white_threshold and
   pixdata[x, y][1] <= white_threshold and
   pixdata[x, y][2] <= white_threshold:
    pixdata[x, y] = (0, 0, 0, 255)

然后您可能想要使用阈值。

旁注:我很确定有一种比双循环方式更快的方法来遍历所有像素,虽然我不记得它们是从我的头顶。

答案 1 :(得分:0)

I have found a satisfactory solution:

def makeimage(self):
    img = Image.open("piimagefunny.png")        
    img = img.resize((100,100))
    pixdata = img.load()
    for y in range(img.size[1]):
        for x in range(img.size[0]):
            if pixdata[x, y] <= (255, 255, 255, 255) and pixdata[x, y] > (0, 0, 0, 10):                
                pixdata[x, y] = (128, 128, 128)
    img = img.resize((30,30), Image.ANTIALIAS)
    self.piimage = ImageTk.PhotoImage(img)

The difference is to resize it before, no need for ANTIALIAS, but bigger than what you want, so that later the ANTIALIAS has some pixels to work with, also the above example recolors any color of the image.