やりたかった事
GD(プラスアルファ)を使用してビットマップをJPEGに変換できたので、
今度はImageMagick(正確にはimagick)で試してみた。
結果と今後
50MB位のビットマップ画像を、10秒程度で変換したので、まずはよいとします。
後は本来の意味でサムネイル画像を作成するのと、
サムネイル既存ならそちらを使う様に改善するのと、
hoverで拡大画像を表示できたらいいなぁ。
先に全体のコード
displayimgs.php
<?php
print <<< _HTML_
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8"/>
<title>ビットマップ画像を表示</title>
</head>
<body>
<h1>ビットマップ画像を表示する</h1>
_HTML_;
$work_dir = opendir('work/');
if (isset($_GET["imageno"])) {
$imageno = $_GET["imageno"];
$image = $imageno;
}
while (false !== ($file[] = readdir($work_dir)));
closedir($work_dir);
natsort($file);
reset($file);
$reverse = array_reverse($file, true);
if (!isset($imageno)) {
$imageno = 0;
$image = 0;
}
$pageline = 4; //1ページに表示させる枚数
$imagecount = 0;
while (false !== ($bmp = each($reverse))){
if (preg_match ("|.bmp$|", $bmp[1])) {
$imagecount++;
if ($imageno == ($image+$pageline)) {
break;
}
if ($imagecount > $image) {
print "<div style='float:left;margin-right:4px;margin-bottom:8px;'>\n";
print "<table cellspacing='0' cellpadding='0' border='0'>\n";
print "<tr>\n";
$work_dir2 = "work/";
$work_img= dirname(__FILE__)."/".$work_dir2.$bmp[1];
$imagick = new Imagick();
$imagick->readImage($work_img);
$imagick->writeImages('temp.jpg', false);
if('temp.jpg' !== FALSE){
print "<td><img src=\"temp.jpg\" alt=\"".$bmp[1] ."のサムネイル\"></td>\n";
}
print "</tr>\n";
print "<tr>\n";
print "<td align='left'>" . $bmp[1] . "</td>\n";
print "</tr>\n";
print "</table>\n";
print "</div>\n";
$imageno++;
}
}
}
echo '<div style="margin-top:12px;clear:both;">';
echo '<p class="txt">';
$page = $imageno+$pageline;
if ($imageno > $pageline) {
$backno = $imageno-($pageline*2);
print "<a href='displayimgs7_2.php?imageno=" . $backno . "'>back</a>";
}
if ($imageno < $imagecount) {
print "<a href='displayimgs7_2.php?imageno=" . $imageno . "'>next</a>";
}
echo '</div>';
echo '<a href =./index.html>トップへ戻る</a>';
echo '</body>';
echo '</html>';
?>
軽く解説
初めの方は主にヘッダの部分で、いちいちエコーするのが面倒で、
枠としてHTMLの記載にしてます。
その後、画像のあるディレクトリを開き、画像数を数え、
画像のリストを出して整形、
指定するページ数に合わせて、
ビットマップ画像を表示してます。
今回のメインになるのは、こちら。
displayimgs_part.php
$work_dir2 = "work/";
$work_img= dirname(__FILE__)."/".$work_dir2.$bmp[1];
$imagick = new Imagick();
$imagick->readImage($work_img);
$imagick->writeImages('temp.jpg', false);
if('temp.jpg' !== FALSE){
print "<td><img src=\"temp.jpg\" alt=\"".$bmp[1] ."のサムネイル\"></td>\n";
}
print "</tr>\n";
print "<tr>\n";
print "<td align='left'>" . $bmp[1] . "</td>\n";
メインの解説
HTMLタグは無視するとして。
なんと、readImage()は、フルパスもしくは、\$_SERVER['DOCUMENT_ROOT'].でないと読んでくれなかった。
ただ、開発環境と実稼働の環境が異なり、\$_SERVER['DOCUMENT_ROOT'].が環境毎に異なるが、
コードをその為に書き換えるのは嫌です。
幸い、dirname(__FILE__).が通ったので、何とかなった。
他に意外とはまったのは、'temp.jpg' !== FALSEでシングルクォートが抜けてた事。
しっかりみると、temp.jpgなんて書いた日には、tempなる定数と、jpgなる定数を、つなぎ合わせた定数になってしまうので、なんのことやら、である。