web-dev-qa-db-ja.com

画像のサイズ変更時にGd2が色を洗い流さないようにするにはどうすればよいですか?

CodeIgniter1.7を使用して写真共有コミュニティサイトを開発しました。メンバーによってアップロードされた写真は、CodeIgniter ImageManipulationクラスを使用するさまざまな形式で自動的にサイズ変更されます。このクラスはフレームワークに組み込まれており、基本的にはGd、Gd2、ImageMagick、NETPBMなどの複数の画像操作ライブラリのラッパーです。私のホストでは、Gd2しか使用できないので、ここでこの質問をします。

私の問題に移ります。これが私のサイトのサイズ変更された写真の例です。オリジナルは非常に大きく、幅が3000pxを超えていることに注意してください。

http://www.jungledragon.com/image/195/female_impala_close-up.html

次に、同じ画像を見てください。これもサイズが変更されており、Flickrで少し大きくなっています。

http://www.flickr.com/photos/fledder/3763538865/in/set-72157621744113979

劇的な違いがわかりますか?私はその大きなギャップを埋めようとしています。私が最初にしたことは、画像にシャープフィルターを適用することでした。あなたはここで結果を見ることができます:

enter image description here

まだ完璧ではありませんが、少なくともFlickr画像のシャープネスレベルに近づいています。残りの問題は、彩度が低下したかのように色が洗い流されることです。これはすでにシャープニングフィルターの前に発生するため、Gd2にある必要があります。

この問題は私にとって非常に重要ですが、どこを見ればよいのかわかりません。クロマサブサンプリングについて話している.NETスレッドをいくつか見つけましたが、セットアップでその情報をどう処理するかわかりません。セットアップの制約内で機能するソリューションを探しています。

更新:これにより、元のファイルは、自分のサイトとFlickrの両方にアップロードしたとおりになります。

http://www.jungledragon.com/img/DSC07275.jpg

アップデート2:ショックを受けました。いい意味で。 ImageMagickをインストールするのに大変な苦労をしましたが、それに切り替えた後(Code Igniter画像操作クラスで使用するライブラリとして「imagemagick」を設定することでした)、テスト画像の結果は次のようになります。

enter image description here

ImageMagickのサイズ変更は、意図したとおりに実行されます。色は保存され、シャープネスがあります。はい、ImageMagickのために不要になったため、カスタムシャープニングルーチンを無効にしました。その上、プロセスははるかに高速で、メモリの消費も少なくなります。そして、ここにもう1つの大きな部分があります。それを説明することはできませんが、ユーザー@Alixによって提案された特定のカラープロファイルを使用するようにImageMagickに指示することはまったくありませんでした。これまでの私のテストでは、埋め込みプロファイルの有無にかかわらず、色情報が尊重されているように見えます。出力は、単に入力の小さいバージョンです。 ImageMagickは本当に賢いのですか、それとも私は夢を見ていますか?

34
Fer

私はこれをImagickでさらにテストすることができました:

Imagick sRGB Test

画像の左半分はImagickと sRGB_IEC61966-2-1_no_black_scaling.icc カラープロファイル。右半分にはカラープロファイルが関連付けられておらず、ImagickまたはGdで処理した場合はまったく同じように表示されます。これが私が使用したコードです:

header('Content-type: image/jpeg');

$image = new Imagick('/path/to/DSC07275.jpg');

if (($srgb = file_get_contents('http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc')) !== false)
{
    $image->profileImage('icc', $srgb);
    $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
}

$image->thumbnailImage(1024, 0);

echo $image;

これは、color.orgWebサイトで入手可能ないくつかのsRGBプロファイルの比較です。

sRGB Comparison

3番目のプロファイルが最も鮮明な結果を生成するように思えますが、それ以外は、どのようにして決定的な選択を行うのかわかりません。


[〜#〜] edit [〜#〜]:どうやら、ImagickにはsRGBプロファイルがバンドルされているので、ダウンロードする必要はありません。 Image Color Consortium Webサイトから、次のコードですべてのシナリオを処理できます。

header('Content-type: image/jpeg');

$image = new Imagick('/path/to/DSC07275.jpg');
$version = $image->getVersion();
$profile = 'http://www.color.org/sRGB_IEC61966-2-1_no_black_scaling.icc';

if ((is_array($version) === true) && (array_key_exists('versionString', $version) === true))
{
    $version = preg_replace('~ImageMagick ([^-]*).*~', '$1', $version['versionString']);

    if (is_file(sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version)) === true)
    {
        $profile = sprintf('/usr/share/ImageMagick-%s/config/sRGB.icm', $version);
    }
}

if (($srgb = file_get_contents($profile)) !== false)
{
    $image->profileImage('icc', $srgb);
    $image->setImageColorSpace(Imagick::COLORSPACE_SRGB);
}

$image->thumbnailImage(1024, 0);

echo $image;
25
Alix Axel

元の画像にはAdobe RGB (1998)ICCプロファイルが添付されています。プロファイルを知らないGdが画像データを誤って解釈していると思います。これが 関連PHPバグ これを確認するものです。

正しいプロファイル、おそらくsRGBで画像を準備する必要があります。それができるアプリケーションがある場合は、それをsRGBに変換して再アップロードしてみてください。

この問題に対する永続的なサーバー側のソリューションが必要な場合は、プロファイルを処理できる画像処理ライブラリが必要になると思います。正直なところ、ImageMagickがこれらのことをどのように処理するかはわかりませんが、少なくともカラープロファイルの基本的な概念には精通しています。

関連: sRGBとAdobe RGBの比較

6
Pekka

このスレッドに貢献するための情報が少しあります。私は写真家であり、Web開発者ではないため、技術的な知識はあまりありませんが、この問題に取り組んでいるので、この投稿が他の誰かの助けになることを願っています。

Gdを使用してすべての画像をリサンプリングするオンライン写真販売ツールを使用しています。広色域モニターで表示すると、適切なsRGB変換とICCプロファイリングを添付してアップロードした場合でも、画像がファンキーに見えるという問題がありました。

私が問題を見つけたのは、Gdが元のファイルからすべてのメタデータとICCプロファイルを取り除くことです。次に、ブラウザはプロファイルを表示せず、それらを正しく表示していません。標準色域モニターではわずかですが、広色域では非常に明白です。

これで問題が発生した場合は、Firefoxを使用し、about:configの設定を変更することで、私の理論をテストできます。 「gfx.color_management.mode」の値をデフォルトの「2」から「1」に変更します。この設定により、FirefoxはICCプロファイルのない画像がsRGBであると想定し、そのように表示します。画像は期待どおりに表示され、Photoshop/Lightroom/etcと同じになります。デフォルトが私を超えているので、なぜすべてのブラウザがこの常識的なアプローチを使用しないのですか。

残念ながら、私のショッピングカートはPHP Gdを使用するように設定されているだけなので、現時点では良い結果を得ることができません。ICCプロファイルを添付したままにするか、次のオプションを使用できるようにGdを更新してほしいです。エクスポート時に単純なsRGBプロファイルを追加します。

詳細はこちら: http://www.gballard.net/psd/go_live_page_profile/embeddedJPEGprofiles.html#

4
Sean

私はこのスクリプトを見つけました:

https://github.com/slavicv/jpeg-icc/blob/master/class.jpeg_icc.php

このスクリプトは、カラープロファイルを元の画像から新しい画像にコピーします。したがって、サイズを変更した後、元の画像からカラープロファイルを追加できます。このスクリプトは、トリックを行うためにImagickを必要としません。

3
Gerda Havertong