PHPからCairoを使う
皆さんは、PHPから直線や円弧を描いたり文字を描いたりしその結果を画像として出力したい場合やPDFを作成したい場合、どのような方法で処理を実現しますか?画像処理ライブラリであるGD、PDF作成ライブラリであるFPDFといったものを使ったりするのが一般的ではないでしょうか。しかし、今回はCairoと呼ばれる画像処理ライブラリを紹介したいと思います。
Cairoとは画像処理ライブラリの一種で、ベクターベース、クロスプラットフォーム、PDFやPNG、SVG等々様々なバックエンドをサポートしていて、その特徴からFirefoxの次期バージョンやGUIツールキットであるGTK+といったもので使われています。
このような特徴を持つCairoをPHPから使うために、cairo_wrapperという拡張モジュールがあります。この拡張モジュールを用いることによりPHPから容易にCairoを使用することが可能になります。
では、早速使ってみましょう。
pecl install cairo_wrapper-beta
上記コマンドでインストールすることが出来ます。インストール完了後、 cairo_wrapper.soを使用できるようにするためphp.ini等に設定を追加してください。
完了したら、以下のサンプルスクリプトを実行してください。
<?php
$surface = cairo_pdf_surface_create("sample.pdf", 605.0, 855.0);
$cr = cairo_create($surface);
cairo_set_source_rgb ($cr, 0.0, 0.0, 1.0);
cairo_move_to($cr, 150, 150);
cairo_select_font_face($cr ,"VL Gothic", CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size($cr, 72);
cairo_show_text($cr, "PHPプロ!");
cairo_show_page($cr);
cairo_destroy($cr);
cairo_surface_destroy($surface);
?>
「PHPプロ!」と描かれたPDF、sample.pdfが作成されます。もし文字が正しく表示されていない場合は、上記サンプルスクリプトのcairo_select_font_faceに記述してある「VL Gothic」を環境に合ったフォント名に変更してください。
この他にも様々な機能があるのですが、先のサンプルスクリプトのcairo_show_text()の箇所をcairo_text_path()を使用して以下のように変更すると
cairo_text_path($cr, "PHPプロ!");
cairo_set_source_rgb($cr, 0.5, 0.5, 1);
cairo_fill_preserve($cr);
cairo_set_source_rgb($cr, 0, 0, 0);
cairo_set_line_width($cr, 5);
cairo_stroke($cr);
先ほどと微妙に違って、テキストからパスを作成して「こんにちは」という文字を黒の太い線で縁取りをし薄紫色で塗りつぶしています。いかがでしょうか、Cairoをこのような処理をいとも簡単に行うことが可能になります。
また、PDFではなくPNG形式の画像にしたいという場合は、下記サンプルスクリプトのようにcairo_pdf_surface_create()ではなくcairo_image_surface_create()と
cairo_surface_write_to_png()を使うことにより可能になります。
<?php
$surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 605.0, 855.0);
$cr = cairo_create($surface);
cairo_set_source_rgb ($cr, 0.0, 0.0, 1.0);
cairo_move_to($cr, 150, 150);
cairo_select_font_face($cr ,"VL Gothic", CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size($cr, 72);
cairo_show_text($cr, "PHPプロ!");
cairo_show_page($cr);
cairo_destroy($cr);
cairo_surface_write_to_png($surface, "sample.png");
cairo_surface_destroy($surface);
?>
興味のある方は使ってみてはいかがでしょうか。
バックナンバーについて
TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。




