【问题标题】:PIL: Thumbnail and end up with a square imagePIL:缩略图并以方形图像结尾
【发布时间】:2010-11-26 01:26:43
【问题描述】:

打电话

image = Image.open(data)
image.thumbnail((36,36), Image.NEAREST)

将保持纵横比。但我最终需要像这样显示图像:

<img src="/media/image.png" style="height:36px; width:36px" />

我可以在图像周围设置透明或白色的信箱样式吗?

【问题讨论】:

    标签: python png thumbnails python-imaging-library alpha


    【解决方案1】:

    PIL 已经有一个功能可以做到这一点:

    from PIL import Image, ImageOps
    thumb = ImageOps.fit(image, size, Image.ANTIALIAS)
    

    【讨论】:

    • 2 年后...... /跨度>
    • 这种方法会以某种方式裁剪我的图像以适应分辨率。
    • 使用此方法不会生成带有透明填充的方形图像。
    • 为什么有这么多赞?这根本无法回答问题。
    • 它得到了很多支持,因为这个问题在谷歌搜索 python pil resize and crop 时出现的频率很高,这是一个优雅的解决方案,尽管它与 OP 无关。
    【解决方案2】:

    将图片粘贴成大小合适的透明图片作为背景

    from PIL import Image
    size = (36, 36)
    image = Image.open(data)
    image.thumbnail(size, Image.ANTIALIAS)
    background = Image.new('RGBA', size, (255, 255, 255, 0))
    background.paste(
        image, (int((size[0] - image.size[0]) / 2), int((size[1] - image.size[1]) / 2))
    )
    background.save("output.png")
    

    编辑:修正语法错误

    【讨论】:

    • 更新:使用Image.ANTIALIAS 而不是Image.NEAREST 以获得更高质量和压缩图像。
    • 注意:一定要使用background.save()不要 image.save()
    • 对于 Python 3,将“/”替换为“//”
    【解决方案3】:
    from PIL import Image
    
    import StringIO
    
    def thumbnail_image():
        image = Image.open("image.png")
        image.thumbnail((300, 200))
        thumb_buffer = StringIO.StringIO()
        image.save(thumb_buffer, format=image.format)
        fp = open("thumbnail.png", "w")
        fp.write(thumb_buffer.getvalue())
        fp.close()
    

    【讨论】:

      【解决方案4】:

      Cesar Canassa's answer 的更新。

      这将创建一个image.jpg 的缩略图为image_thumb.jpg

      from PIL import Image, ImageOps
      fname = 'image.jpg'
      size = (48,48)
      thumb = ImageOps.fit(Image.open(fname), size, Image.ANTIALIAS)
      thumb.save('{}_thumb.jpg'.format(fname[:fname.rfind('.')]), "JPEG")
      

      【讨论】:

        【解决方案5】:

        或者这个,也许……(原谅意大利面)

        from PIL import Image
        
        def process_image(image, size):
            if image.size[0] > size[0] or image.size[1] > size[1]:
                #preserve original
                thumb = image.copy()
                thumb.thumbnail(size,Image.ANTIALIAS)
                img = thumb.copy()
            img_padded = Image.new("RGBA",size)
            img_padded.paste(image,(int((size[0]-image.size[0])/2),int((size[1]-image.size[1])/2)))
            return img_padded
        

        【讨论】:

          【解决方案6】:

          为什么不简单地使用resize方法呢?

          from PIL import Image
          image = Image.open('/path/to/img.png')
          image = image.resize((36,36), Image.ANTIALIAS)
          

          请参阅此发行说明中有关调整图像大小的建议: https://pillow.readthedocs.io/en/stable/releasenotes/5.3.0.html

          【讨论】:

            【解决方案7】:

            您可以将 Nadia 的答案包含在此函数中,这样您就可以控制大小和背景。

            def make_square(im, min_size=36, fill_color=(255, 255, 255, 0)):
                x, y = im.size
                size = min(min_size, x, y)
                new_im = Image.new('RGBA', (size, size), fill_color)
                im.thumbnail((256, 256))
                new_im.paste(im, (int((x - size) / 2), int((y -size) / 2))
                return new_im
            

            【讨论】:

              猜你喜欢
              • 2013-09-05
              • 2013-07-26
              • 2011-05-12
              • 1970-01-01
              • 2011-06-28
              • 1970-01-01
              • 1970-01-01
              • 2018-05-29
              • 2010-10-27
              相关资源
              最近更新 更多