Python PIL 绘制阳光的圆弧段
我遇到了一个问题,我想在一张图片的某个位置画一个圆圈或物体,然后从这个物体发出光线,每条光线之间的角度间隔是1度。不过,这些光线只会在145度的范围内发射,所以并不是完整的一个圆。我正在使用Python的PIL库来完成这个任务,虽然我对这个库还不太熟悉。
def drawSunshine(im):
draw = ImageDraw.Draw(im)
x, y = im.size
draw.ellipse((370,200, 400,230), fill='red',outline='black')
draw.line((370,205,390,218), fill='black',width=3)
draw.point((100,100),'red')
im.show()
我在想,我可以先遍历圆圈周围的每一个像素,然后改变这些像素的颜色。
编辑 这个方法对我来说是有道理的,因为我打算在一张黑白的PNG文件上绘制这个图像。如果当前像素是白色的,我就会在这条线上再画一个像素;如果当前像素是黑色的,我就会把它当作障碍物,然后在那一点结束这条线。
不过,我有几个主要问题:
- 我该如何在图片中任意位置的物体周围遍历,使得这个区域呈现出一个圆形或圆弧的形状?
- 我该如何确保每条我画的“光线”之间的间隔是1度?
- 编辑 有没有办法让这些“光线”被黑色像素中断?
1 个回答
4
这里有一个小函数,你可以根据需要进行调整;
import Image, ImageDraw
from math import sin, cos, pi
width, height = 400, 400
skyBlue = (135, 206, 235)
im = Image.new("RGBA", (width, height), skyBlue)
#Draw Sun
draw = ImageDraw.Draw(im)
def drawSun(draw, centre, radius, rays=False, startAngle=0, finishAngle=360, rayAngle=10, rayGap=10, rayLength=1000, rayColour="Yellow", rayOutline="Orange"):
x1,x2 = centre[0] - radius, centre[0] + radius
y1,y2 = centre[1] - radius, centre[1] + radius
if rays:
for rayStart in range(startAngle, finishAngle, rayAngle+rayGap):
rayEnd = (rayStart+rayAngle) * pi/180
rayStart *= pi/180
corner1 = centre[0] + rayLength*cos(rayStart), centre[1] + rayLength*sin(rayStart)
corner2 = centre[0] + rayLength*cos(rayEnd), centre[1] + rayLength*sin(rayEnd)
print [centre, corner1, corner2]
draw.polygon([centre, corner1, corner2], fill="Yellow", outline="Orange")
draw.ellipse((x1, y1, x2, y2), fill="Yellow", outline="Orange")
drawSun(draw, (100, 100), 40, rays=True, startAngle=0, finishAngle=145, rayAngle=3, rayGap=5)
im.save("example.png")