首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python,Python Image Library 1.1.6中,如何在不调整大小的情况下扩展画布?

在Python,Python Image Library 1.1.6中,如何在不调整大小的情况下扩展画布?
EN

Stack Overflow用户
提问于 2009-10-15 14:23:55
回答 4查看 13.5K关注 0票数 25

我可能在手册中寻找了错误的东西,但我正在寻找一个图像对象并扩展它,而不是调整(拉伸/挤压)原始图像的大小。

玩具示例:想象一个蓝色矩形,200x100,然后我执行一些操作,我有一个新的图像对象,400x300,由一个白色背景组成,上面有一个200x100蓝色矩形。如果我可以控制这个扩展的方向,或者新的背景颜色等,那就是奖励。

基本上,我有一个图像,我将迭代添加到其中,但我不知道它一开始的大小。

我想我可以抓取原始对象,创建一个新的、稍微大一点的对象,将原始对象粘贴到那里,再画一点,然后重复。它看起来可能在计算上是昂贵的。然而,我认为这是一个函数,因为我假设这是一个常见的操作。也许我的假设是错的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-15 15:03:47

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

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

代码语言:javascript
复制
newImage = Image.new(mode, (newWidth,newHeight))
newImage.paste(srcImage, (x1,y1,x1+oldWidth,y1+oldHeight))

如果性能有问题,请使原始图像大于所需大小,并在绘制完成后对其进行裁剪。

票数 33
EN

Stack Overflow用户

发布于 2015-01-06 00:52:46

基于interjays答案:

代码语言:javascript
复制
#!/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()
票数 15
EN

Stack Overflow用户

发布于 2009-10-15 16:55:26

你可能会考虑用一种完全不同的方法来处理你的形象。使用固定大小的瓷砖构建它。这样,当您需要扩展时,只需添加新的图像块即可。完成所有计算后,可以确定图像的最终大小,创建该大小的空白图像,并将平铺粘贴到其中。这应该会减少你为完成任务而寻找的复制量。

(当然,您可能希望将这样的平铺图像封装到一个对象中,从而对其他代码层隐藏平铺方面。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1572691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档