MTEntryPolaThumb - ポラロイド風サムネイルを表示するMT Plugin
id:secondlifeさんのPolaroizeに影響されて作ってみました。
しばらく使って、問題なく使えているようですので公開してみます。
パラメータがハードコーディングとか、超適当です。
特に必要なもの
- PerlMagick
- wget
※ XREAで動作確認済み。
Perlだけで完結したかったんですが、力量不足でwgetを使いました。
ですので、たぶんWindows環境では動作しません。
使い方
特記事項
- エントリに記載されている「最初のJPG画像のURL」を使って処理します。
- 画像が無いエントリでは、「PolaThumb/noimage.jpg」を表示するようになっています。ここに好きな画像をおいてください。
- 本プラグインを、既に大量のエントリがあるブログに導入する場合、初回の再構築にかなりの時間がかかる可能性があります。
- サーバに負担がかかる可能性があります。
- 使用は自己責任でおねがいします。
- MITライセンスです。
ソースコード
# # MTEntryPolaThumb Plugin # # copyright (c) kinumi. # # MIT license # package MT::Plugin::PolaThumb; use strict; use Image::Magick; use Digest::SHA1 qw(sha1_hex); use MT::Plugin; use MT::Template::Context; # Plugin information my $plugin = new MT::Plugin({ name => "MTEntryPolaThumb", description => "エントリで使用されている写真から、ポラロイド風サムネイル画像を作成、表示する。" }); MT->add_plugin($plugin); # Tag MT::Template::Context->add_tag( EntryPolaThumb => \&EntryPolaThumb ); # # 引数で与えられたテキストから、最初に登場するJPG画像URLを抽出して返す。 # sub extract_imgurl { my($text) = @_; $text =~ m|(http://.+?\.jpg)|; return $1; } # # MTEntryPolaThumbタグの実装 # sub EntryPolaThumb { my ($ctx, $args) = @_; my ($bg, $img, $shadow); # PerlMagick用 my $imgurl; # JPG画像URL my $imgurl_hash; # JPG画像URLのハッシュ値 my $tmppath; # 画像ダウンロード先 my $imgpath; # 画像保存先 my ($l, $x, $y); # 画像情報 my ($entry, $blog); # エントリ情報とブログ情報 my ($site_url, $site_path); # サイトのURLとサイトのパス my ($entry_title); # エントリのタイトル # ブログ情報取得 $blog = $ctx->stash("blog"); $site_url = $blog->site_url; $site_path = $blog->site_path; # エントリ情報取得 $entry = $ctx->stash("entry"); $entry_title = $entry->title; # エントリからJPG画像URLを抽出して、画像保存先を決める $imgurl = extract_imgurl($entry->text) or return qq(<img src="$site_url/PolaThumb/noimage.jpg" />); $imgurl_hash = sha1_hex($imgurl); $imgpath = "$site_path/PolaThumb/$imgurl_hash.jpg"; # 既に作成済みなら終了 if (-f $imgpath) { return qq(<img src="$site_url/PolaThumb/$imgurl_hash.jpg" alt="$entry_title" />); } # フォルダが無かったら作成する if (! -e "$site_path/PolaThumb") { mkdir "$site_path/PolaThumb"; } # 画像をダウンロードする $tmppath = $blog->site_path . "/PolaThumb/tmp.jpg"; system("wget $imgurl -o /dev/null -O $tmppath"); # ポラロイドっぽくエフェクトをかける $bg = Image::Magick->new(size => "74x84"); $bg->Read("xc:#f5f3e4"); $bg->Border(width => 1, height => 1, fill => "#e0e0e0"); $img = Image::Magick->new; $img->Read($tmppath); if ($img->Get("rows") > $img->Get("columns")) { $l = $img->Get("columns"); $x = 0; $y = ($img->Get("rows") - $l) / 2; } else { $l = $img->Get("rows"); $x = ($img->Get("columns") - $l) / 2; $y = 0; } $img->Set(background => "none"); $img->Crop(x => $x, y => $y, width => $l, height => $l); $img->Resize(width => 66, height => 66); $bg->Composite(image => $img, x => 5, y => 5, compose => "Over"); $bg->Set(background => "none"); $bg->Rotate(degrees => 90); $bg->Wave(amplitude => 2, wavelength => 200); $bg->Rotate(degrees => -90); $shadow = $bg->Clone(); $shadow->Set(background => "#ffffff"); $shadow->Flop(); $shadow->Colorize(color => "#c0c0c0", opacity => "30"); $shadow->Border(width => 10, height => 10, fill => "#ffffff"); $shadow->Blur(radius => 0, sigma => 2); $shadow->Composite(image => $bg, x => 6, y => 8, compose => "Over"); $shadow->Write($imgpath); return qq(<img src="$site_url/PolaThumb/$imgurl_hash.jpg" alt="$entry_title" />); } 1;