25

私はおそらくハンドブックで間違ったものを探していますが、画像オブジェクトを取得して、元の画像のサイズを変更 (ストレッチ/スクイッシュ) せずに拡大しようとしています。

おもちゃの例: 200 x 100 の青い四角形を想像してください。次に、何らかの操作を実行すると、200 x 100 の青い四角形が置かれた白い背景で構成される新しい画像オブジェクト 400 x 300 ができました。これがどの方向に拡大するか、または新しい背景色などを制御できる場合のボーナス.

基本的に、繰り返し追加する画像があり、最初はどのサイズになるかわかりません。

元のオブジェクトをつかんで、新しい、少し大きなオブジェクトを作成し、そこに元のオブジェクトを貼り付け、もう少し描画して、繰り返すことが可能だと思います。計算コストがかかりそうです。ただ、これはよくある操作だと思いますので、機能はあるのではないかと思いました。おそらく私は間違っていると思いました。

4

4 に答える 4

33

ImageOps.expand 関数は画像を拡大しますが、各方向に同じ量のピクセルを追加します。

最善の方法は、単純に新しい画像を作成して貼り付けることです。

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

パフォーマンスが問題になる場合は、元の画像を必要以上に大きくし、描画が完了した後にトリミングします。

于 2009-10-15T15:03:47.237 に答える
17

interjays の回答に基づく:

#!/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()
于 2015-01-05T16:52:45.943 に答える
6

画像に対してかなり異なるアプローチを検討するかもしれません...固定サイズのタイルから画像を構築します。そうすれば、拡張する必要があるときに、新しい画像タイルを追加するだけです. すべての計算が完了したら、イメージの最終的なサイズを決定し、そのサイズの空白のイメージを作成して、タイルを貼り付けることができます。これにより、タスクを完了するために見ているコピーの量が減るはずです。

(もちろん、そのようなタイル化された画像をオブジェクトにカプセル化し、タイル化の側面をコードの他のレイヤーから隠したいと思うでしょう。)

于 2009-10-15T16:55:26.030 に答える