LoginSignup
0
0

More than 5 years have passed since last update.

PHPでImageMagick、正確にはimagickを使ってビットマップをJPEGに変換してみる

Last updated at Posted at 2016-04-04

やりたかった事

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なる定数を、つなぎ合わせた定数になってしまうので、なんのことやら、である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0