MTEntryPolaThumb - ポラロイド風サムネイルを表示するMT Plugin

kinumi2007-04-21


id:secondlifeさんのPolaroizeに影響されて作ってみました。


しばらく使って、問題なく使えているようですので公開してみます。
パラメータがハードコーディングとか、超適当です。

なにこれ?

エントリで使用されている写真から、ポラロイド風サムネイル画像を作成、表示します。

こんなかんじです

特に必要なもの

XREAで動作確認済み。


Perlだけで完結したかったんですが、力量不足でwgetを使いました。
ですので、たぶんWindows環境では動作しません。

使い方

  1. ソースコードを「PolaThumb.pl」等の名前で、MTのpluginsフォルダに保存します
  2. サイトパスの直下に「PolaThumb」ディレクトリを作成します。(MTが書き込みできるパーミッションにします)
  3. あとは「MTEntry〜」タグが使えるところで、「MTEntryPolaThumb」タグが使えます

特記事項

  • エントリに記載されている「最初の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;