15158


**現状**  
フォント名を含む一覧は取得できたのですが、これをループで回して画像出力するにはどうすればよいでしょうか？

[code]

    exec("convert -list font", $output);
    print_r($output);
    
[/code]

* * *
[code]

    Array
    (
        [0] => 
        [1] => Path: /usr/lib64/ImageMagick-6.5.4/config/type-ghostscript.xml
        [2] =>   Font: AvantGarde-Book
        [3] =>     family: AvantGarde
        [4] =>     style: Normal
        [5] =>     stretch: Normal
        [6] =>     weight: 400
        [7] =>     glyphs: /usr/share/fonts/default/Type1/a010013l.pfb
        [8] =>   Font: AvantGarde-BookOblique
        [9] =>     family: AvantGarde
        [10] =>     style: Oblique
        [11] =>     stretch: Normal
        [12] =>     weight: 400
        [13] =>     glyphs: /usr/share/fonts/default/Type1/a010033l.pfb
        [14] =>   Font: AvantGarde-Demi
        [15] =>     family: AvantGarde
        [16] =>     style: Normal
        [17] =>     stretch: Normal
        [18] =>     weight: 600
        [19] =>     glyphs: /usr/share/fonts/default/Type1/a010015l.pfb
        [20] =>   Font: AvantGarde-DemiOblique
        [21] =>     family: AvantGarde
        [22] =>     style: Oblique
        [23] =>     stretch: Normal
        [24] =>     weight: 600
        [25] =>     glyphs: /usr/share/fonts/default/Type1/a010035l.pfb
        [26] =>   Font: Bookman-Demi
        [27] =>     family: Bookman
        [28] =>     style: Normal
        [29] =>     stretch: Normal
        [30] =>     weight: 600
        [31] =>     glyphs: /usr/share/fonts/default/Type1/b018015l.pfb
        [32] =>   Font: Bookman-DemiItalic
    
[/code]

* * *

**環境**  
・CentOS 6.4  
・ImageMagick-6.5.4  
・PHP 5.4.32


CC BY-SA 3.0
2015-09-02T15:10:36.117
15151
2015-09-03T12:28:29.637
2015-09-03T00:43:04.177
7290
7886
question
php imagemagick
PHP + ImageMagick ／ サーバにインストールされている全てのフォント毎に、ダミー文字列を一覧でテキスト画像化したい


exec を使うのであればシェルスクリプト(one-liner)でも良いかと思います。

[code]

    exec("convert -list font | grep -Po '(?<=Font: ).+' | xargs -I@ convert -background white -fill black -font '@' -pointsize 64 label:'StackOverFlow' 'output/@.png'")
    
[/code]

`label:` に文字列を指定します。また、画像ファイルの出力先を `./output`
ディレクトリにしていますが、実際には絶対パスで指定する方が良いかと思います(予めディレクトリを作成しておくのをお忘れなく)。

ただ、フォントの種類によっては変換できない(文字コードに対応するフォントグリフを持っていないか、別のグリフが割り当てられている)場合があって、その場合には俗に言う「豆腐」になったり、「文字化け」の様な状態になりますのでご留意下さい。

  * Analecta  
[![Analecta](https://i.stack.imgur.com/FvIey.png)](https://i.stack.imgur.com/FvIey.png)

  * Impact  
[![Impact](https://i.stack.imgur.com/YxUHJ.png)](https://i.stack.imgur.com/YxUHJ.png)

  * mry_KacstQurn

[![mry_KacstQurn](https://i.stack.imgur.com/YvT5h.png)](https://i.stack.imgur.com/YvT5h.png)

  * msam10

[![msam10](https://i.stack.imgur.com/FzWxU.png)](https://i.stack.imgur.com/FzWxU.png)

**追記**

exec() を使わないで同様の処理を行う場合、PHP のプログラムから ImageMagick のライブラリを利用することになるかと思います。Ubuntu
Linux では `php5-imagick` パッケージがそれに当たります。まずはそのパッケージをインストールします。

[code]

    $ sudo apt-get install php5-imagick
    
[/code]

コードとしては以下で、これは前述のシェルスクリプトと同じ処理を行います。

[code]

    <?php
    
      function draw_text($text, $font, $size, $output_dir) {
        $draw = new ImagickDraw();
        $draw->setFont($font);
        $draw->setFontSize($size);
        $draw->setFillColor('black');
        $draw->setGravity(Imagick::GRAVITY_CENTER);
    
        $bg = new ImagickPixel();
        $bg->setColor('white');
    
        $img = new Imagick();
        $metrics = $img->queryFontMetrics($draw, $text);
        $img->newImage($metrics['textWidth'], $metrics['textHeight'], $bg);
        $img->annotateImage($draw, 0, 0, 0, $text);
    
        $img->setImageFormat('png');
        $img->writeImage($output_dir . "/" . $font . '.png');
    
        $img->destroy();
      }
    
      $text = 'StackOverFlow';
      $size = 64;
      $output_dir = './output';
    
      $fonts = (new Imagick)->queryFonts();
      foreach($fonts as $font){
        draw_text($text, $font, $size, $output_dir);
      }
    ?>
    
[/code]

PHP でプログラムを書くのは初めてなので、非効率的な書き方になっていると思いますが、参考にしてみて下さい。


CC BY-SA 3.0
2015-09-02T17:30:22.197
15158
2015-09-03T12:28:29.637
2015-09-03T12:28:29.637
15151
answer