PythonImageLibrary 1.1.6中,如何在不调整大小的情况下展开画布?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (153)

PythonImageLibrary 1.1.6中,如何在不调整大小的情况下展开画布?

玩具例子:想象一个蓝色矩形,200 x 100,然后我执行一些操作,我有一个新的图像对象,400 x 300,由一个白色背景组成,其中一个200 x 100蓝色矩形。如果我可以控制这个扩展的方向,或者新的背景色,等等。

提问于
用户回答回答于

展开函数将扩展图像,但它在每个方向上添加相同数量的像素。

最好的方法就是制作一个新的图像并粘贴:

newImage = Image.new(mode, (newWidth,newHeight))
newImage.paste(srcImage, (x1,y1,x1+oldWidth,y1+oldHeight))

如果性能是一个问题,使您的原始图像大于需要,并在完成绘图后裁剪它。

用户回答回答于

根据闭会期间的答复:

#!/usr/bin/env python

from PIL import Image
import math


def resize_canvas(old_image_path="314.jpg", new_image_path="save.jpg",
                  canvas_width=500, canvas_height=500):
    """
    Resize the canvas of old_image_path.

    Store the new image in new_image_path. Center the image on the new canvas.

    Parameters
    ----------
    old_image_path : str
    new_image_path : str
    canvas_width : int
    canvas_height : int
    """
    im = Image.open(old_image_path)
    old_width, old_height = im.size

    # Center the image
    x1 = int(math.floor((canvas_width - old_width) / 2))
    y1 = int(math.floor((canvas_height - old_height) / 2))

    mode = im.mode
    if len(mode) == 1:  # L, 1
        new_background = (255)
    if len(mode) == 3:  # RGB
        new_background = (255, 255, 255)
    if len(mode) == 4:  # RGBA, CMYK
        new_background = (255, 255, 255, 255)

    newImage = Image.new(mode, (canvas_width, canvas_height), new_background)
    newImage.paste(im, (x1, y1, x1 + old_width, y1 + old_height))
    newImage.save(new_image_path)

resize_canvas()

扫码关注云+社区

领取腾讯云代金券