如何绘制PIL透明图像的Unicode字符(How to draw unicode characte

2019-09-18 07:43发布

我想借鉴使用Python(PIL要准确)某些Unicode字符和图像。

使用下面的代码,我可以生成一个白色的背景图像:

(“entity_code”被传递到方法)

    size = self.font.getsize(entity_code)
    im = Image.new("RGBA", size, (255,255,255))
    draw = ImageDraw.Draw(im)
    draw.text((0,6), entity_code, font=self.font, fill=(0,0,0))
    del draw
    img_buffer = StringIO()
    im.save(img_buffer, format="PNG")

我试过如下:

(“entity_code”被传递到方法)

    img = Image.new('RGBA',(100, 100))
    draw = ImageDraw.Draw(img)
    draw.text((0,6), entity_code, fill=(0,0,0), font=self.font)
    img_buffer = StringIO()
    img.save(img_buffer, 'GIF', transparency=0)

然而,这无法吸引Unicode字符。 它看起来像我结束了一个空的透明图像:(

我缺少的是在这里吗? 有没有更好的方式来绘制蟒蛇透明图像上的文字?

Answer 1:

你的代码示例是所有的地方,和我比较,你是不是在填充颜色和背景颜色的使用您的RGBA图像是不够具体@fraxel同意。 但是我不能真正得到你的代码示例在所有的工作,因为我真的没有你的代码是如何结合在一起的想法。

此外,就像@monkut提到你需要看看你正在使用,因为你的字体可能不支持特定Unicode字符的字体。 不过不支持的字符应该绘制成空方(或任何默认值),所以你至少会看到一些类型的输出。

我创建了一个简单的例子,下面,吸引了Unicode字符和它们保存到.png文件。

import Image,ImageDraw,ImageFont

# sample text and font
unicode_text = u"Unicode Characters: \u00C6 \u00E6 \u00B2 \u00C4 \u00D1 \u220F"
verdana_font = ImageFont.truetype("verdana.ttf", 20, encoding="unic")

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

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

# draw the text onto the text canvas, and use black as the text color
draw = ImageDraw.Draw(canvas)
draw.text((5,5), unicode_text, font = verdana_font, fill = "#000000")

# save the blank canvas to a file
canvas.save("unicode-text.png", "PNG")

上面的代码创建下面显示的PNG:

作为一个方面说明,我在Windows上使用弼1.1.7和Python 2.7.3。



Answer 2:

我认为你必须确保你装字体支持您试图输出的字符。

这里有一个例子: http://blog.wensheng.com/2006/03/how-to-create-images-from-chinese-text.html

font = ImageFont.truetype('simsun.ttc',24)


Answer 3:

在你的例子,你创建一个RGBA图像,但你不指定的值alpha通道(所以它默认为255)。 如果更换(255, 255, 255)(255,255,255,0)应该工作正常(如0阿尔法像素是透明的)。

为了显示:

import Image
im = Image.new("RGBA", (200,200), (255,255,255))
print im.getpixel((0,0))
im2 = Image.new("RGBA", (200,200), (255,255,255,0))
print im2.getpixel((0,0))
#Output:
(255, 255, 255, 255)
(255, 255, 255, 0)


文章来源: How to draw unicode characters on transparent image in PIL