45

PILを使用してテキストをレンダリングしようとしていますが、率直に言って、結果はがらくたです。

たとえば、Photoshopで書いたテキストは次のとおりです。

PhotoShop

そしてPILから何が出てくるか:

PIL

ご覧のとおり、PILの結果は満足のいくものではありません。気難しいだけかもしれませんが、PILを使用してテキストを描画し、参照画像により近い結果を得る方法はありますか?

これが、Python2.7とPIL1.1.7で使用しているコードです。

image = Image.new("RGBA", (288,432), (255,255,255))
usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25)
d_usr = ImageDraw.Draw(image)
d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font)
4

6 に答える 6

69

私は自分が受け入れられると思う独自の解決策を思いついた。

私がやったことは、テキストを大きくすることでした。たとえば、必要なサイズの3倍に縮小してから、アンチエイリアスを使用してサイズを縮小します。100%完璧ではありませんが、デフォルトよりもはるかに優れており、cairoやパンゴ。

例えば、

image = Image.new("RGBA", (600,150), (255,255,255))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", fontsize)

draw.text((10, 0), txt, (0,0,0), font=font)
img_resized = image.resize((188,45), Image.ANTIALIAS)

そして、あなたはこの結果に終わります、

最終結果

これは、同じフォントで以前に得ていたものよりもはるかに優れています。

于 2011-03-25T08:29:07.337 に答える
21

pycairo(Cairo描画ライブラリのPythonバインディング)を使用してみてください。アンチエイリアス処理された線などを使用して、より洗練された描画に役立ちます。また、ベクターベースの画像を生成することもできます。

フォントやレイアウトを正しく処理することは複雑であり、「pango」および「pangocairo」ライブラリも使用する必要があります。それらは本格的なフォント作業用に作られていますが(すべてのGTK +ウィジェットはフォントレンダリングにpangoを使用します)、利用可能なドキュメントと例は非常に貧弱です。

以下のサンプルは、システムで使用可能なプリントを示し、コマンドラインでパラメータとして渡されたフォントファミリでサンプルテキストをレンダリングします。

# -*- coding: utf-8 -*-
import cairo
import pango
import pangocairo
import sys

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 320, 120)
context = cairo.Context(surf)

#draw a background rectangle:
context.rectangle(0,0,320,120)
context.set_source_rgb(1, 1, 1)
context.fill()

#get font families:

font_map = pangocairo.cairo_font_map_get_default()
families = font_map.list_families()

# to see family names:
print [f.get_name() for f in   font_map.list_families()]

#context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)

# Positions drawing origin so that the text desired top-let corner is at 0,0
context.translate(50,25)

pangocairo_context = pangocairo.CairoContext(context)
pangocairo_context.set_antialias(cairo.ANTIALIAS_SUBPIXEL)

layout = pangocairo_context.create_layout()
fontname = sys.argv[1] if len(sys.argv) >= 2 else "Sans"
font = pango.FontDescription(fontname + " 25")
layout.set_font_description(font)

layout.set_text(u"Travis L.")
context.set_source_rgb(0, 0, 0)
pangocairo_context.update_layout(layout)
pangocairo_context.show_layout(layout)

with open("cairo_text.png", "wb") as image_file:
    surf.write_to_png(image_file)

レンダリングされた画像

于 2011-03-24T04:57:34.340 に答える
13

私はPILを使用したことがありませんが、Drawメソッドのドキュメントを簡単に確認すると、PILが単純なグラフィックをレンダリングする方法を提供していることがわかります。Photoshopは、複雑なグラフィックをレンダリングする方法を提供します。Photoshopのような結果に近づくには、少なくともフォントヒンティングとアンチエイリアシングが必要です。PILのドキュメントは、そのような機能を備えていることを示唆していません。画像にテキストをレンダリングするのにより良い仕事をするかもしれない外部ツールを使用することを検討したいかもしれません。たとえば、ImageMagick(標準の24ビットRGBを処理する8ビットバージョンを使用する必要があります)。ここでいくつかのテキスト描画サンプルを見つけることができます:http://www.imagemagick.org/Usage/draw/

于 2011-03-24T04:43:54.430 に答える
6

提案:ワンドまたは別のイメージングライブラリを使用する

これがワンドの例です-

from wand.color import Color
from wand.image import Image
from wand.drawing import Drawing
from wand.compat import nested

with Drawing() as draw:
    with Image(width=1000, height=100, background=Color('lightblue')) as img:
        draw.font_family = 'Indie Flower'
        draw.font_size = 40.0
        draw.push()
        draw.fill_color = Color('hsl(0%, 0%, 0%)')
        draw.text(0,int(img.height/2 + 20), 'Hello, world!')
        draw.pop()
        draw(img)
        img.save(filename='image.png')

出てくる画像-

于 2017-11-30T02:11:57.837 に答える
6

python3には、エイリアスフォントのオプションがあります。私はどこにもこの答えを見つけることができませんでした、うまくいけば、それはグーグルでこの質問を見つけて、答えを見つけるために長い時間を掘らなければならなかった私のような誰かを助けるでしょう。

draw = ImageDraw.Draw(img)
        draw.fontmode = "L"

こちらのドキュメントに記載されています

于 2020-07-09T10:49:08.790 に答える
-4

フォントを2回書いてみることもできます。これにより、品質が大幅に向上します。

image = Image.new("RGBA", (288,432), (255,255,255))
usr_font = ImageFont.truetype("resources/HelveticaNeueLight.ttf", 25)
d_usr = ImageDraw.Draw(image)
d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font)
d_usr = d_usr.text((105,280), "Travis L.",(0,0,0), font=usr_font)
于 2014-11-01T02:04:01.207 に答える