gpt4 book ai didi

python - PIL 的 image.paste 操作会降低图像/绘制文本的质量

转载 作者:行者123 更新时间:2023-12-01 05:50:40 35 4
gpt4 key购买 nike

我正在 Windows 7 平台上使用 Python 2.7.3 和 PIL 1.1.7 进行开发。

我正在尝试编写一个 python 脚本来生成一组带有文本的图像。由于我需要将文本换行并将其放入任意边界框中,因此我编写了一个方法,将文本绘制到打开 alpha 透明层的白色 RGBA 背景图像上。为了简化问题,我写了一个小的Python脚本来说明问题:

import Image,ImageDraw,ImageFont
import webbrowser

# sample text and font
text = "The text quality will degrade with the paste operation."
verdana_font = ImageFont.truetype("verdana.ttf", 20)

# get the line size
text_width, text_height = verdana_font.getsize(text)

# create a blank canvas with extra space between lines
blank_canvas = Image.new('RGB', (text_width + 10, text_height * 10 + 5 * 10), (255, 255, 255))

# create a blank RGBA canvas for the drawn text
text_canvas = Image.new('RGBA', (text_width, text_height), (255, 255, 255, 0))

draw = ImageDraw.Draw(text_canvas)

# draw the text onto the text canvas
draw.text((0,0), text, font = verdana_font, fill = "#000000")

# print 10 lines
for x in range(0,10):

# calculate the coordinates for the paste operation and debug
coordinates = (5, 5 + (x * (5 + text_height)))
print "x = %d | coordinates = %r" % (x, coordinates)

# paste the text onto the blank canvas
blank_canvas.paste(text_canvas, coordinates, text_canvas)

# create a temporary canvas
temp_canvas = Image.new('RGBA', (text_width, text_height), (0, 0, 0, 0))

# paste the text canvas onto the temp canvas using the png alpha layer for transparency
temp_canvas.paste(text_canvas, (0,0), text_canvas)

# swap the canvases
text_canvas = temp_canvas

# save the blank canvas to a file
blank_canvas.save("paste-degradation.png", "PNG")

# open the image up to see the paste operation's image degradation
webbrowser.open("paste-degradation.png")

每次将文本粘贴到新的“临时” Canvas 上时,所绘制文本的图像质量都会变得越来越差。上面的代码生成的图像如下所示:

Degraded Text Quality

我的代码有问题吗?或者 PIL 中有错误吗?

最佳答案

问题在于,draw.text() 的行为有点意外。

draw.text() 通过设置一些像素来填充(这些像素肯定在文本内部),而不接触其他像素(那些绝对在文本外部)来绘制文本。但是,如果发现某个像素位于文本的 25% 部分,则 draw.text() 将简单地将新像素设置为 fill 的 25% 和文本的 75%。旧值。但这样的比率独立应用于 RGBA 的所有 4 个分量。在此示例中,您的背景为 (255, 255, 255, 0),fill 为 (0, 0, 0, 255):因此文本中 25% 的像素将为 ( 192、192、192、64)。

但我认为这不是直观的结果。直观的结果是 (0, 0, 0, 64)。如果您将这样的文本粘贴到全红色图像上,那么上面的像素最终仍将贡献 25% 的浅灰色 (192, 192, 192)。换句话说,您将看到灰色边框,而您期望的只有黑色、红色和介于两者之间的颜色。

(事实上,上面的解释太简单了:将背景设置为 (0, 0, 0, 0) 没有帮助。我怀疑这是因为该颜色实际上相当于 (255, 255, 255, 0 ),即完全透明。而且似乎在 canvas.paste(img, (0,0), img) 调用中使用了相同的算法。)

解决此问题的方法是仅使用从文本中绘制的图像的 alpha 波段,即将 temp_canvas.paste(text_canvas, (0,0), text_canvas) 替换为 temp_canvas。粘贴(“#000000”,(0,0),text_canvas)

关于python - PIL 的 image.paste 操作会降低图像/绘制文本的质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14442086/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com