Python PIL 绘制阳光的圆弧段

0 投票
1 回答
2539 浏览
提问于 2025-05-01 16:52

我遇到了一个问题,我想在一张图片的某个位置画一个圆圈或物体,然后从这个物体发出光线,每条光线之间的角度间隔是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")

在这里输入图片描述

撰写回答