5

私はPythonを使用して最初のWebアプリケーションを作成するのに多くの時間を費やし、画像の生成にを使用しています。たくさん読んだ後、私は適切なテキストの整列、折り返し、多くの拡張子を持つファイルの生成などを実装することができました。

ただし、PILによって生成されたすべてのテキストは上部で切り取られます。これがサンプルです。

上部でテキストが切り取られたPIL生成画像の例

さまざまなフォントで言う必要がŻÓĆjygpqあります(フォント名は左側にあります)。

ここでいくつかの投稿を見つけました。PILでフォントがクリッピングされていますが、別のモジュール(aggdraw)の使用は避けたいと思います。私はすでにPILで非常に多くのことを理解しているので、それに固執したいと思います。

さまざまなサイズのフォントをたくさん試しましたが、テキストが途切れています。PILフォントを使用しようとしましたが、それでも機能しません。[また、OTFをBDFおよびPILに変換します]。

これはUbuntuにあります。次に何を試してみるべきですか?

4

2 に答える 2

4

これが間違っていることを願っていますが、唯一の正しい修正は、_imagingft.c がテキストをレンダリングする方法にパッチを当てることに依存しています。PIL はこのタスクを FreeType に依存していますが、PIL はポジショニングを誤っているようです。また、 の高さgetsizeが過大評価されています (問題はありませんが)。現時点では、これらの問題を処理するためのパッチをhttp://pastebin.com/jP2iLkDNに配置しました (レンダリング コードにパッチを適用するためのより良い方法があるようです)。

以下は、パッチを適用した場合と適用しない場合の出力の例です。

ここに画像の説明を入力     ここに画像の説明を入力

リンクされたディスカッションにあるコードを使用した結果。OSX の場合:

ここに画像の説明を入力     ここに画像の説明を入力

Ubuntu の場合:

ここに画像の説明を入力     ここに画像の説明を入力

上位の数値を生成するコードは次のとおりです。

# -*- encoding: utf8 -*-
import sys
import Image, ImageDraw, ImageFont

im = Image.new("RGBA", (1000, 1000), 'white')
draw = ImageDraw.Draw(im)

start_y = 7
text = u'\u00d1\u00d3yŻ\u00d4Ćgp\u010c\u0137'
for i in xrange(28, 46, 2):
    font = ImageFont.truetype('Junicode-Bold.ttf', i)
    width, height = font.getsize(text)
    draw.rectangle((0, start_y, width, height + start_y), outline='blue')
    draw.text((0, start_y), text, font=font, fill='black')
    start_y += height + 7

im.crop((0, 0, width + 1, start_y + 2)).save(sys.argv[1])

下の図は、テキストの一部を切り取る PIL に関するリンクされたトピックにあるコードに従って生成されました。

于 2012-12-12T01:00:45.513 に答える
2

最善の解決策ではありませんが、テキストの先頭に末尾のスペースを追加することでこれを解決した人がいます。

于 2012-12-11T14:35:58.467 に答える