ImageMagick でサムネイル化すると IE7 で表示されないバグについて

ImageMagick を使用してアップロード写真のサムネイルを生成すると、Internet Explorer(以下 IE )でサムネイルが表示されない、という現象が起きます。

※表示されない=画像リンク切れ同様の×マークが表示されます。


不思議なことに Firefox では全く問題なく閲覧可能です。また、IEでも一部のサムネイル画像にだけ上記の現象が起きて、多くの場合は正しく表示されます。


ImageMagick では IE で表示できなくなる画像でも、GD を使用してサムネイル化すると正常に表示できます。


IE のバグなのか、ImageMagick のバグなのか???


バグの原因そのものが特定できず、苦労したのでメモしておきます。


なお、以下のページでも現象の報告はされていますが、原因究明がなされていないので参考になりませんでした。

              • -

OpenPNEの画像縮小にImageMagickを用いているのですが、一部のgif画像が表示されないという現象が起きました

#591 (IE7で表示されない画像がある) - OpenPNE - Trac

            • -


※ 以下は理論的に究明したわけではなく、試行錯誤の結果なので間違っているかもしれません。


【原因】

まず結論から。

IE では色空間が CMYK の画像を表示できない


これが上記の現象の原因です。色空間が RGB の画像は表示できるのですが、IEでは CMYK の画像は表示できないそうです。色の専門家ではない上に、ImageMagick のバグなのか、IEのバグなのかも見当がつけられなかったので、この原因を突き止めるのに相当苦労しました。


【確認方法】

[前提]
Imagick の基本的な使い方は本題からずれるので省略します。ここでは説明のためサムネイル作成手順を以下のように簡略化します。
(imagick オブジェクトの基本的なメソッドの説明もPHPマニュアルを見れば解決するので省略)

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
$imagick->thumbnailimage(400, 300);
$imagick->writeImage(SAVE_FILE_NAME);
?>


表示に成功する画像と失敗する画像の確認方法は以下です。

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
var_dump($imagick->getImageColorspace());// CMYK の場合 int(12) , RGB の場合int(1) 
exit;
?>


ほとんどの画像ファイルは int(1) つまり 色空間が RGB なのですが、まれに int(12) つまり CMYK のものがあります。この CMYKIE でのみ表示できない失敗画像です。

      • -

※基本的なことなので省略しましたが、なぜ RGB が 1 で CMYK が 12 なのかわからない方は ImageMagick の定義済み定数( imagick::COLORSPACE_RGB と imagick::COLORSPACE_CMYK )を参照してください。
http://jp.php.net/manual/ja/imagick.constants.php

      • -


以上が原因確認方法となります。


【解決方法】

imagick::setImageColorspace で色空間を(強制的に) RGB に設定します。(後述しますがうまくいきません!!)

<?php
// うまくいきません!!
$imagick = new Imagick(LOAD_FILE_NAME);
$imagick->setImageColorspace(1);// RGB に設定
$imagick->thumbnailimage(400, 300);
$imagick->writeImage(SAVE_FILE_NAME);
?>


一応、IE でも表示されるサムネイルができるのですが、色空間を変更すると画像が異常に汚くなります。実際に手を動かして確認頂けると明らかですが、サービスとして使えるレベルではありません。


RGB から CMYK への変換は Adobe系のソフトではスムーズらしいですが(未確認)、ImageMagick では難しいようです。
CMYK の画像は ImageMagick をあきらめて、(一般的に画質は良くないですが) GD にするしかなさそうです。

※ GD を使うと CMYK の画像もスムーズに RGB に変換されます。なお、GD の場合には色空間の設定/変換処理は内部的に実行されるため、PHP側での処理は特に必要ありません。

<?php
$imagick = new Imagick(LOAD_FILE_NAME);
$colorSpace = $imagick->getImageColorspace();
if ($colorSpace == 1) {
    $imagick->thumbnailimage(400, 300);
    $imagick->writeImage(SAVE_FILE_NAME);
} else {
    // GD
    // 省略

}
?>


以上です。

    • -

1行PR

真夜中ナビ 深夜営業・24時間営業のお店探し