代码之家  ›  专栏  ›  技术社区  ›  Phil

从URL读取图像,调整其大小并应用抗锯齿

  •  2
  • Phil  · 技术社区  · 8 年前

    我正在尝试调整大小,并对之前在Tkinter中显示的图像应用抗锯齿。我是从一个网址上读的。问题是,我用tkinter打开了图像。PhotoImage,我需要的resize()函数在PIL中。形象我想知道是否有一种方法可以从一个转换到另一个,或者其他一些方法可以解决这个问题。

    代码如下:

    import tkinter
    from urllib.request import urlopen
    import base64
    from PIL import Image
    
    window = tkinter.Tk()
    
    url = "https://s.yimg.com/os/weather/1.0.1/shadow_icon/60x60/partly_cloudy_night@2x.png"
    b64_data = base64.encodestring(urlopen(url).read())
    image = tkinter.PhotoImage(data=b64_data)
    
    # Function I need:
    #image = image.resize((100, 100), Image.ANTIALIAS)
    
    label = tkinter.Label(image=image)
    label.pack()
    
    window.mainloop()
    

    如果有一个完全不同的方式,我可以做到这一点,我想听听。

    2 回复  |  直到 8 年前
        1
  •  4
  •   user1767754    8 年前

    好的,首先使用PIL,然后使用PIL的TKinter格式将其转换为TKinter图像。我没有 urllib 在我的系统上,所以我使用了请求,但那部分应该是可交换的。

    import tkinter
    import base64
    from PIL import Image, ImageTk
    
    import requests
    from PIL import Image
    from StringIO import StringIO
    url = "https://s.yimg.com/os/weather/1.0.1/shadow_icon/60x60/partly_cloudy_night@2x.png"
    r = requests.get(url)
    pilImage = Image.open(StringIO(r.content))
    pilImage.resize((100, 100), Image.ANTIALIAS)
    
    window = tkinter.Tk()
    
    
    image = ImageTk.PhotoImage(pilImage)
    
    label = tkinter.Label(image=image)
    label.pack()
    
    window.mainloop()
    

    有一整页专门针对PIL和Tkinter: http://effbot.org/tkinterbook/photoimage.htm

        2
  •  2
  •   Phil    8 年前

    我编辑了@user1767754代码,因为我有一些问题,但它确实帮了我很大的忙。

    注意:我使用了BytesIO而不是StringIO。此外,我在“RGBA”中添加了图像模式,因为我在显示灰度图像时遇到了问题。还有一些小问题。

    代码:

    import tkinter
    from PIL import Image, ImageTk
    from io import BytesIO
    import requests
    
    window = tkinter.Tk()
    
    url = "https://s.yimg.com/os/weather/1.0.1/shadow_icon/60x60/partly_cloudy_night@2x.png"
    r = requests.get(url)
    
    pilImage = Image.open(BytesIO(r.content))
    pilImage.mode = 'RGBA'
    pilImage = pilImage.resize((50, 50), Image.ANTIALIAS)
    
    
    image = ImageTk.PhotoImage(pilImage)
    
    label = tkinter.Label(image=image)
    label.pack()
    
    window.mainloop()