9

ImageMagick のフォント ファミリを使用してフォントをレンダリングすることは可能ですか?

考えられることはすべて試しましたが、何もうまくいかないようです。私は多くの検索を行ってきましたが、この特定の問題に対処するものを見つけることができないようです.

私は最終的に PHP を使用していますが、コマンドラインで ImageMagick を使用しようとしても成功しませんでした。LinuxでImageMagick 6.7.6を使用しています。これが私がこれまでに行ったことです。

  • identify -list fontコマンドを使用してImageMagickが認識するフォントをテストしました
  • システムにインストールされた xml ファイルに基づいて type.xml ファイルを手動で作成しました。
  • このスクリプトを使用して type.xml ファイルを作成しました: imagick_type_gen
  • 複数のフォント タイプでテストしました: ttf、otf、pfb、ttc

identify -list fontこれは、私がテストしたいくつかのフォントの出力例です。

Font: DejaVu-Sans-Book
  family: DejaVu Sans
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/dejavu/DejaVuSans.ttf

Font: Baskerville-Regular
  family: Baskerville
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/custom/Baskerville.ttc

Font: Palatino-Roman
  family: Palatino
  style: Normal
  stretch: Normal
  weight: 400
  glyphs: /usr/share/fonts/urw-fonts/p052003l.pfb

Font: Honey-Script-Light
  family: Honey Script
  style: Normal
  stretch: Normal
  weight: 300
  glyphs: /usr/share/fonts/custom/HoneyScript-Light.ttf


完全なフォント名を指定すると、すべてが期待どおりに機能します。

convert -pointsize 32 -font "Honey-Script-Light" label:'Testing' testing.png

働く


ただし、フォント ファミリ ( identify -list fonttype.xml でリストされているものと type.xml にリストされているもの) を使用しようとすると、既定のシステム フォントが取得されます。

convert -pointsize 32 -family "Honey Script" label:'Testing' testing.png

動作しない


また、フォントのすべてのパラメーターを指定しようとしましたが、再び機能しません。

convert -pointsize 32 -stretch Normal -style Normal -weight 300 -family "Honey Script"   label:'Testing' testing.png



PHP で同様のプロセスを実行すると、描画オブジェクトのフォント ファミリを設定しようとすると、実際にはエラーが返されます。

$draw->setFontFamily('Honey Script');

これはスローされるエラーです:

PHP Fatal error:  Uncaught exception 'ImagickDrawException' with message 'Unable to set font family; parameter not found in the list of configured fonts



コマンド ライン オプションと同様に、完全なフォント名を指定すると、画像が適切にレンダリングされます。

$draw->setFont('Honey-Script-Light');



ImageMagick で使用するフォントを構成する方法について私が見つけたすべてから、フォントは実際に構成されています。フォントファミリーに基づいてフォントを選択できないのはなぜですか?

これはおそらく文書化されていないバグですか? 足りないものはありますか?

完全なフォント名を指定するだけで完了できることはわかっていますが、私のプロジェクトに固有の理由があり、フォント ファミリを指定する方がはるかに優れています。

機能しない場合、フォント ファミリを指定することがオプションになるのはなぜですか? これは、ImageMagick がフォント ファミリ オプションに関して次のように述べていることです。

この設定は、ImageMagick がテキストのレンダリングに使用しようとするフォント ファミリーを提案します。ファミリが見つかった場合は、それが使用されます。そうでない場合は、デフォルト フォント ("Arial" など) または類似していることが知られているファミリが代用されます (たとえば、"System" が要求されたが見つからない場合は "Courier" が使用される可能性があります)。

どんなアイデアでも大歓迎です。私はこの時点でかなり立ち往生しています。


編集:
完全な名前のフォントではなく、フォント ファミリを使用することを好む主な理由は、処理中の入力のためです。処理が必要なファイルを第三者から受け取りました。これらのファイルは、フォントを次のように指定します。

font-family="Honey Script" font-style="Normal" font-stretch="Normal" font-weight="300"

その情報に基づいて正確なフォント名を指定する必要がある場合は、フォント ファミリと属性のすべての可能な組み合わせについて、正確なフォント名へのマッピングを作成する必要があります。システムには何百ものフォントが追加されているため、これを維持するのは非常に困難です。

上記のフォントに関する利用可能なすべての詳細に基づいて、ImageMagick に正確なフォントを取得させる方法が必要であると私には思えます。

それが不可能な場合、ImageMagick にフォント ファミリを指定するオプションがあるのはなぜですか?

4

2 に答える 2

4

使用可能なすべての Imagick フォントを画像として (ブラウザーに) 出力する方法を次に示します。

 public function test_fonts(){
    //load background
    $im = new Imagick();
    $im->newimage(800, 10000, 'lightgray');
    $y = 10;
    $i = 1;
    foreach($im->queryFonts() as $font){
        $insert_image = new Imagick();
        $insert_image->newImage(600, 30, 'whitesmoke');
        $insert_image->setImageFormat("png");
        $draw = new ImagickDraw();
        $draw->setFont($font);
        $draw->setFontSize(25);
        $draw->setFillColor(new ImagickPixel('black'));
        $draw->setgravity(imagick::GRAVITY_NORTH);
        $insert_image->annotateImage($draw, 0, 0, 0, $i . '.' .  $font );
        $im->compositeImage( $insert_image,  $insert_image->getImageCompose(),100, $y);
        $y += 30;
        $i++;
    }
    $im->setImageFormat('jpg');
    header('Content-Type: image/jpg');
    echo $im;

}

次のように表示されます。 ここに画像の説明を入力

于 2014-11-06T09:34:10.890 に答える
2

これは、フォント ファミリの仕組みによるものです。たとえば、"Arial" フォント ファミリには、太字、イタリック、下線などの特定のフォント定義が含まれています。画像で使用するフォントを選択するときは、明確にする必要があります。

あなたが本当にしたいのなら、次のことができると思います:

  1. フォントファミリ名を取得し、スペースをダッシュ​​に置き換えます
  2. それが機能する場合、素晴らしいです!
  3. -Regularそうでない場合は、最後に追加して再試行してください

ただし、強制されない限り、フォントファミリでプログラム的なことを行うべきではありません;-)

私の imagick 知識のソースは、主にこの男から来ています: http://valokuva.org/?cat=1

于 2012-05-14T03:39:35.420 に答える