あけましておめでとうございます。本年1発目の記事は、元webブログらしく技術的なやつで。
プログラミングはPerlから入ったのもあって、ImageMagickをPerlで使う方法しか知りませんでした。(というか、ImageMagick使いたくてPerl勉強した)
先日リリースした「カラログ」や「ソウルジェムメーカー」を制作している時、全部PHPやりたいなぁというのもあり、Imagickの使い方を勉強しました。
そんなわけで、勉強したことをシェアしておきます。
/* 2019.1.7追記 */
サンプルが表示されなくなっていたので、修正しました。環境によってはフルパスでないとエラーになるようです。
読み込みや書き出しのファイル名は$rfilename = realpath($filename);
などして、フルパスに置き換えてください。
ImageMagickとImagickの違いについて
PHPでImageMagickを使いたい!となったとき、Imagickというのが出てきて、そこでよく分からなくなってたんですが、違いを調べたらなるほど納得。
ImageMagick | C言語で書かれた画像処理ソフトウェア・ライブラリ |
---|---|
Imagick | PHPからImageMagickを操作するためのPHP拡張モジュール |
Image::Magick(PerlMagick) | PerlからImageMagickを操作するためのPerlモジュール |
これが分かってから、すんなりサンプルが読めるようになりました。なるほどです。
参考)
[PHP]ImageMagickとImagickの違いについてそろそろ一言いっておくか。 – DQNEO起業日記
[Perl]ImageMagickとImage::Magickの違いについてそろそろ一言いっておくか。 – DQNEO起業日記
以下は自分がよく使うImagickのサンプルです。
よく使うImagickのサンプル
使用した元画像)
※素敵な薬棚の写真は無料写真素材ぱくたそからお借りしました。
画像の読み込み&表示
実行結果
サンプル1
画像の読み込み&書き出し
実行結果
サンプル2
※リンク先では「Complete!」の文字と書き出された画像が表示されます。
フォーマット変更
実行結果
サンプル3
分かりにくいですが、jpeg画像がgif画像として表示されています。
「setImageFormat(‘gif’)」の部分と画像ヘッダーの「header(“Content-Type: image/gif”);」のgifをpngにすれば、png画像として表示や書き出しをすることが出来ます。
サイズ変更
実行結果
サンプル4
縦横比を維持したままリサイズする場合は、thumbnailImage(100, 0)のどちらかを0にすることで出来ます。
縦横比を無視する場合は、両方に値を設定します。
また、今回はthumbnailImageを使用しましたが、他にもresizeImageやscaleImageなどがあります。
どれを使うのが良いのか?という疑問については以下の記事が参考になると思います。
参考)PECL::Imagick で画像リサイズ処理する場合どれ使えばいいか – (0 3 0)
サムネイルを作る
実行結果
サンプル5
※リンク先では「Complete!」の文字と読み込んだ画像と作成されたサムネイル画像が表示されます。
$image->clone();で読み込んだ画像のコピーを作成し、そのコピーをリサイズしています。
画像を重ねる
実行結果
サンプル6
重ねる画像を半透明にしたい場合は、以下のようにすると可能です。
実行結果
サンプル6(PNG半透明)
重ねている画像が透過PNGなので上記の方法でしたが、透過PNGでない場合は、以下のようにsetImageOpacityで出来ます。
実行結果
サンプル6(JPEG半透明)
色を変える
実行結果
サンプル7
colorizeImageの二番目のパラメータは、色味を変えるのが目的なら1でも0でも結果は同じになります。
/* 2019.1.7 修正 */
colorizeImageで色が変わらない場合、setImageBackgroundColorで変えることができます。
効果を付ける
実行結果
サンプル8(油絵調)
油絵調の他にも、色んな効果があります。
にじみ
実行結果
サンプル8(にじみ)
エンボス加工
実行結果
サンプル8(エンボス)
ネガ反転
実行結果
サンプル8(ネガ反転)
他にも色々な加工ができますので、やってみると面白いですよ。
文字を書く
実行結果
サンプル9
drawオブジェクトを生成してテキストを書き、それを画像にのせる、というイメージだと分かりやすいかもしれません。
実行結果
サンプル9(日本語)
日本語フォントをフルパスで指定すると、日本語で文字を書くことが出来ます。
今回のサンプルにはあんずもじを使用しました。
また、文章を改行したい場合は「\n」で改行ができます。
文字の位置については以下の記事がとても詳しく書かれていて参考になります。
参考)imagickで画像に文字列を合成する際の位置 | アライドアーキテクツ エンジニアブログ
簡単な図形を描く
実行結果
サンプル10
ImagickDrawはそれはそれで色々とやり方があるみたいです。
この辺はもう少し勉強したいですね。
上記のサンプルをまとめたzipファイルも一応用意してみました。必要な方はどうぞ。
(使用した写真やフォントファイルは入っていませんのでご注意を)
そういえば、destroy()は非推奨なのでclear()を使いましょう、とあるんですが、clear()を使ってる方をあまり見かけないんですよね。
clear()のコメントを読むと、ちょっと違うだけで殆ど重複している、らしい。公式が非推奨というからには、clear()がいいんでしょうが、どうなんですかね?
下記サイトでも色んなフィルタを使用したサンプルや、コードの書き方など紹介されていて、参考になります。
・Imagickの基本的な使い方
・PECL::Imagickを使う – m-tagの日記
・PECL::Imagick で画像リサイズ処理する場合どれ使えばいいか – (0 3 0)
・imagickで画像に文字列を合成する際の位置 | アライドアーキテクツ エンジニアブログ
PerlでImageMagickを使う方法についてもまとめた記事を書いてるんですが(こちら)、PerlとPHPで考え方は似てるけど、書き方は結構違ったりして面白いです。よかったら見比べてみてくださいね。
[…] http://www.omnioo.com/record/else/imagemagick_basic/ ここわかりやすいです。 […]
[…] 参考にしました(が、私のサーバーでは駄目っぽかった…) PHPでImageMagickを使うImagickのコマンドサンプル […]