3

Pythonを使用して特定のUnicode文字と画像を描画しようとしています(正確にはPIL)。

次のコードを使用すると、背景が白い画像を生成できます。

('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)

ただし、これはユニコード文字の描画に失敗します。空の透明な画像になってしまうようです:(

ここで何が欠けていますか?Pythonで透明な画像にテキストを描画するより良い方法はありますか?

4

3 に答える 3

2

あなたのコード例はいたるところにあり、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 で Pil 1.1.7 と Python 2.7.3 を使用しています。

于 2013-01-21T19:55:49.620 に答える
0

ロードしたフォントが出力しようとしている文字をサポートしていることを確認する必要があると思います。

例: http://blog.wensheng.com/2006/03/how-to-create-images-from-chinese-text.html

font = ImageFont.truetype('simsun.ttc',24)
于 2012-06-21T07:59:24.303 に答える
0

あなたの例では、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)
于 2012-06-21T07:59:55.280 に答える