1

配列または PIL オブジェクトの両方として生成した多数の画像 (10 など) があります。

それらを表示するには、それらを円形に統合する必要があり、画面の解像度に合わせて調整する必要があります。これを行うことができるPythonには何かありますか?

ペーストを使ってみたのですが、解像度のキャンバスとペーストする位置を把握するのが面倒で、もっと簡単な解決策はないでしょうか?

4

1 に答える 1

7

theta隣接する点の間に一定の角度がある場合、点は円に均等に配置されていると言えます。theta2*pi ラジアンをポイント数で割った値として計算できます。最初の点は0x 軸に対して角度があり、2 番目の点は角度theta*1、3 番目の点は角度theta*2などです。

簡単な三角法を使用して、円の端にある任意の点の X 座標と Y 座標を見つけることができます。ohm半径 の円上にある角度のポイントの場合r:

xFromCenter = r*cos(オーム)
yFromCenter = r*sin(オーム)

この計算を使用すると、画像を円上に均等に配置できます。

import math
from PIL import Image

def arrangeImagesInCircle(masterImage, imagesToArrange):
    imgWidth, imgHeight = masterImage.size

    #we want the circle to be as large as possible.
    #but the circle shouldn't extend all the way to the edge of the image.
    #If we do that, then when we paste images onto the circle, those images will partially fall over the edge.
    #so we reduce the diameter of the circle by the width/height of the widest/tallest image.
    diameter = min(
        imgWidth  - max(img.size[0] for img in imagesToArrange),
        imgHeight - max(img.size[1] for img in imagesToArrange)
    )
    radius = diameter / 2

    circleCenterX = imgWidth  / 2
    circleCenterY = imgHeight / 2
    theta = 2*math.pi / len(imagesToArrange)
    for i, curImg in enumerate(imagesToArrange):
        angle = i * theta
        dx = int(radius * math.cos(angle))
        dy = int(radius * math.sin(angle))

        #dx and dy give the coordinates of where the center of our images would go.
        #so we must subtract half the height/width of the image to find where their top-left corners should be.
        pos = (
            circleCenterX + dx - curImg.size[0]/2,
            circleCenterY + dy - curImg.size[1]/2
        )
        masterImage.paste(curImg, pos)

img = Image.new("RGB", (500,500), (255,255,255))

#red.png, blue.png, green.png are simple 50x50 pngs of solid color
imageFilenames = ["red.png", "blue.png", "green.png"] * 5
images = [Image.open(filename) for filename in imageFilenames]

arrangeImagesInCircle(img, images)

img.save("output.png")

結果:

ここに画像の説明を入力

于 2012-11-14T17:53:12.533 に答える