我用Python成像库的ImageDraw.line()绘制了一堆线条,但它们看起来很可怕,因为我找不到一种方法来反锯齿。我如何在PIL中防别线?如果PIL无法做到这一点,是否有另一个Python图像处理库可以?用Python成像库绘制一条反锯齿线
回答
aggdraw提供比PIL更好的绘图。
看起来很不错,但它不是为Ubuntu打包的。我有点需要。 – snostorm 2010-06-26 01:31:45
使用基本绘制(点,笔)方法,线条在aggdraw中仍然看起来不连贯。 – 2013-07-17 07:20:17
这可以用于Python3吗? – DrMickeyLauer 2016-02-02 10:32:57
这是一个真正快速入侵的函数,用于绘制PIL的反锯齿行,我在Google搜索同一个问题后看到这篇文章,并且未能安装aggdraw并处于紧急截止日期之后编写的。这是吴小林的线算法的实现。我希望它可以帮助任何人Google搜索相同的东西!
:)
"""Library to draw an antialiased line."""
# http://stackoverflow.com/questions/3122049/drawing-an-anti-aliased-line-with-thepython-imaging-library
# https://en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm
import math
def plot(draw, img, x, y, c, col, steep, dash_interval):
"""Draws an antiliased pixel on a line."""
if steep:
x, y = y, x
if x < img.size[0] and y < img.size[1] and x >= 0 and y >= 0:
c = c * (float(col[3])/255.0)
p = img.getpixel((x, y))
x = int(x)
y = int(y)
if dash_interval:
d = dash_interval - 1
if (x/dash_interval) % d == 0 and (y/dash_interval) % d == 0:
return
draw.point((x, y), fill=(
int((p[0] * (1 - c)) + col[0] * c),
int((p[1] * (1 - c)) + col[1] * c),
int((p[2] * (1 - c)) + col[2] * c), 255))
def iround(x):
"""Rounds x to the nearest integer."""
return ipart(x + 0.5)
def ipart(x):
"""Floors x."""
return math.floor(x)
def fpart(x):
"""Returns the fractional part of x."""
return x - math.floor(x)
def rfpart(x):
"""Returns the 1 minus the fractional part of x."""
return 1 - fpart(x)
def draw_line_antialiased(draw, img, x1, y1, x2, y2, col, dash_interval=None):
"""Draw an antialised line in the PIL ImageDraw.
Implements the Xialon Wu antialiasing algorithm.
col - color
"""
dx = x2 - x1
if not dx:
draw.line((x1, y1, x2, y2), fill=col, width=1)
return
dy = y2 - y1
steep = abs(dx) < abs(dy)
if steep:
x1, y1 = y1, x1
x2, y2 = y2, x2
dx, dy = dy, dx
if x2 < x1:
x1, x2 = x2, x1
y1, y2 = y2, y1
gradient = float(dy)/float(dx)
# handle first endpoint
xend = round(x1)
yend = y1 + gradient * (xend - x1)
xgap = rfpart(x1 + 0.5)
xpxl1 = xend # this will be used in the main loop
ypxl1 = ipart(yend)
plot(draw, img, xpxl1, ypxl1, rfpart(yend) * xgap, col, steep,
dash_interval)
plot(draw, img, xpxl1, ypxl1 + 1, fpart(yend) * xgap, col, steep,
dash_interval)
intery = yend + gradient # first y-intersection for the main loop
# handle second endpoint
xend = round(x2)
yend = y2 + gradient * (xend - x2)
xgap = fpart(x2 + 0.5)
xpxl2 = xend # this will be used in the main loop
ypxl2 = ipart(yend)
plot(draw, img, xpxl2, ypxl2, rfpart(yend) * xgap, col, steep,
dash_interval)
plot(draw, img, xpxl2, ypxl2 + 1, fpart(yend) * xgap, col, steep,
dash_interval)
# main loop
for x in range(int(xpxl1 + 1), int(xpxl2)):
plot(draw, img, x, ipart(intery), rfpart(intery), col, steep,
dash_interval)
plot(draw, img, x, ipart(intery) + 1, fpart(intery), col, steep,
dash_interval)
intery = intery + gradient
什么是col?什么是陡峭的?一个小解释将不胜感激。 – 2013-07-17 07:21:16
@RamenRecon,我很好奇,也很陡。根据我对代码的阅读,steep是一个布尔值,它表示xdelta是否小于ydelta,因此如果行很陡,可能会影响算法,但它只在内部由drawLine函数和其辅助函数绘图函数使用用户不得不担心。另一方面Col必须由用户给出,并且似乎是用于决定每个点alpha透明度值(即抗混叠效果)的四元组RGBA颜色(红色,gr,蓝色,alpha)。好奇地尝试一下,看看它有多快... – 2014-03-17 23:57:23
Btw @toastie yours是唯一可以在任何地方看到抗锯齿功能的手动Python实现。林惊讶你的答案没有更多upvotes,即时通讯它确实帮助了一堆人。 +1 – 2014-03-18 00:04:14
我有一个类似的问题,我的台词有粗糙的边缘,其中改变方向。我从线路如何在IOS中绘制线索并提出了这个代码。它在线条的末端放置了圆形线条帽,并且真正清理了一些东西。不完全是反锯齿,但是对于PIL来说是全新的,并且很难找到我想分享的答案。需要一些调整,有可能是一个更好的办法,但确实是我需要:)
from PIL import Image
import ImageDraw
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
class DrawLines:
def draw(self, points, color, imageName):
img = Image.new("RGBA", [1440,1080], (255,255,255,0))
draw = ImageDraw.Draw(img)
linePoints = []
for point in points:
draw.ellipse((point.x-7, point.y-7, point.x+7, point.y+7), fill=color)
linePoints.append(point.x)
linePoints.append(point.y)
draw.line(linePoints, fill=color, width=14)
img.save(imageName)
p1 = Point(100,200)
p2 = Point(190,250)
points = [p1,p2]
red = (255,0,0)
drawLines = DrawLines()
drawLines.draw(points, red, "C:\\test.png")
- 1. OpenGL ES的iPhone - 绘制反锯齿线
- 2. 在wx中绘制反锯齿线?
- 3. 如何绘制锯齿线?
- 4. 绘制一个反锯齿梯形
- 5. Chrome使用了哪种反锯齿线绘制算法?
- 6. 如何在光栅中绘制反锯齿贝塞尔曲线?
- 7. 绘制emf抗锯齿
- 8. 如何绘制锯齿状像素化线的OpenGL
- 9. 在OpenGL中绘制一个简单的反锯齿火柴人
- 10. 用WinForms生成非反锯齿字体
- 11. 用画布绘制得到“锯齿”
- 12. 反锯齿iPhone OpenGLES
- 13. 如何用iPhone绘制反锯齿圆OpenGL ES
- 14. 用于绘制粗抗锯齿线的算法
- 15. 面板中的反锯齿图像
- 16. 如何在Flex中反锯齿图像?
- 17. 在java中绘制锯齿形(弹簧)
- 18. 绘制移动正弦波抗锯齿
- 19. 在画布上绘制的文字反锯齿效果不佳
- 20. Pyglet OpenGL绘图抗锯齿
- 21. 以快速方式绘制抗锯齿线
- 22. CGContextClip反锯齿问题
- 23. 使TChromium呈现反锯齿
- 24. 强制Java2D子像素抗锯齿
- 25. 如何用两条斜线绘制一条线使用python
- 26. OpenGL反锯齿不起作用
- 27. 将多条消除锯齿的线连接在一起
- 28. 用户在HTML5画布应用中绘制的平滑锯齿线?
- 29. 用UIBezierPath绘制一条线
- 30. 强制抗锯齿EMF
可能的答案:http://stackoverflow.com/questions/1828345/any-way-to-make-nice-antialiased-圆角为图像在python – unutbu 2010-06-25 23:25:44
嗯,我想这是一个解决方案,如果一个缓慢的。 – snostorm 2010-06-26 13:06:56