5

テキストで画像をバッチ作成する必要があります。要件:

  1. 任意のサイズのビットマップ
  2. PNG形式
  3. 透明な背景
  4. 透明度に対してアンチエイリアス処理された黒のテキスト
  5. 調整可能な文字間隔
  6. 調整可能なテキスト位置 (テキストが始まる x および y 座標)
  7. TrueType および/または Type1 のサポート
  8. Unix コマンド ライン ツールまたは Python ライブラリ

これまでに評価したのは以下のとおりです。

PIL の問題は、たとえば、Verdana のデフォルトの間隔がまばらすぎることです。テキストをもう少しきつくする必要がありますが、PIL で調整する方法がありません。

ImageMagick では、画像内のテキストの開始位置を指定する簡単な方法が見つかりませんでした (-size WIDTHxHEIGHT とキャプション:'TEXT' を使用しています)。透明な境界線を追加すると、テキストが固定されているコーナーから離れますが、

  • 境界線が範囲に追加されるため、それに応じて画像サイズを調整する必要があります
  • 水平方向と垂直方向のオフセットを個別に調整することはできません

明らかな代替手段をいくつか見逃していたり​​、上記の必要な機能を見つけられなかったりしましたか?

4

3 に答える 3

4

(5) 文字列にダミーの狭いスペースを挿入する (カーニングが壊れる) か、SVG や HTML/CSS レンダラーのようなはるかに高レベルのものを使用する以外は、確かにトリッキーに見えます。

ただし、手を汚してもかまわない場合は、PIL の freetype レンダラーをハッキングして水平方向のスペースを追加するのは非常に簡単に見えます。_imagingft.cを参照してください。font_getsize と font_render の両方で次のコードの後:

if (kerning && last_index && index) {
    FT_Vector delta;
    FT_Get_Kerning(self->face, last_index, index, ft_kerning_default,
                   &delta);
    x += delta.x >> 6;
}

追加:

if (last_index && index) {
    x += tracking;
}

最初に追跡用の単純な整数で試してみてください(おそらく「>>6」で判断するとかなり大きい)。コンパイルして、動作するかどうかを確認します。次のステップは、追跡値を Python から C 関数に取得することです。そのためには、font_render の ParseTuple 呼び出しを次のように変更する必要があります。

long tracking;
if (!PyArg_ParseTuple(args, "Ol|il:render", &string, &id, &mask, &tracking))
    return NULL;

そしてfont_getsizeで:

long tracking;
if (!PyArg_ParseTuple(args, "O|l:getsize", &string, &tracking))
    return NULL;

次に、必要な Python インターフェイスを確認します。これは些細なことですが、インターフェイスの各レベルを介して追加の「追跡」引数を追加する非常に面倒なケースです。たとえば、次のようになります。

def truetype(filename, size, index=0, encoding="", tracking= 0): # added optional tracking
    "Load a truetype font file."
    try:
        return FreeTypeFont(filename, size, index, encoding, tracking) # added tracking
    ...

class FreeTypeFont:
    "FreeType font wrapper (requires _imagingft service)"

    def __init__(self, file, size, index=0, encoding="", tracking= 0): # added tracking
        import _imagingft
        self.font = _imagingft.getfont(file, size, index, encoding)
        self.tracking= tracking # add this line

    ...

    def getmask2(self, text, mode="", fill=Image.core.fill):
        size, offset = self.font.getsize(text, self.tracking) # use tracking
        im = fill("L", size, 0)
        self.font.render(text, im.id, mode=="1", self.tracking) # use tracking
        return im, offset

私はこれをテストしていません!動作する場合は、パッチとして提出する価値があるかもしれません。

于 2009-01-21T13:51:57.007 に答える
3

SVG + ImageMagick ソリューションは次のとおりです。

このテンプレートに基づいてプログラムで SVG ドキュメントを作成し、「TEXT HERE」を目的のテキスト コンテンツに置き換えます。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC
      "-//W3C//DTD SVG 1.0//EN"
      "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" width="152px" height="50px">
  <text style="font-size: 22px; font-weight:bold; font-family: Verdana-Bold;
               letter-spacing: -1.3%;">
    <tspan x="10" y="39">TEXT HERE</tspan>
  </text>
</svg>

ImageMagick を使用して、ドキュメントを背景透過の PNG に変換しますconvert

$ convert -background none input.svg output.png
于 2009-01-21T13:53:48.797 に答える
2

一見すると、Pangoは文字間隔をサポートしています。Pango には Python バインディングがあり、Cairo と統合されています。

于 2009-01-21T14:36:45.887 に答える