2009-08-13 20 views
6

私のクライアントのWebサイトでは、ほとんどの場合、PHPサイズ変更スクリプト(GDを使用)があります。アップロードする前にデジタルカメラから巨大な7MP画像のサイズを変更するように何度も言っても、それは決してそれをしません。結果は、元のイメージが解像度が大きすぎるため、サーバーからの「メモリ不足」エラーで、イメージのサイズが変更されません。サーバ上のGDライブラリのサイズが大きすぎます

本当に大きな画像のサイズを変更するより良い方法はありますか?これらの大きな画像のサイズを変更するスクリプトを利用できるAPIを提供するサービスはありますか?

+0

ImageMagickを使用すると、読み込み時のサイズ変更を効率的に行うことができます。詳細については、この回答を参照してください。http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing-in-php/4613341#4613341 –

答えて

3

あなたのPHPページから画像のサイズを変更するためにはImageMagickを呼び出すことができますが、セキュリティは、あなたが許可した場合、システムは、任意のAPIは、多くのメモリを使用します

、あなたのPHPのmemory_limit aswellを変更することができます呼び出す問題があります。

1

たとえば、convertを使用して外部プログラムにシェルすることができます。

1

どのようにそれらをアップロードサイズ変更ジョブをキューイングについては、コマンドラインのPHPスクリプトは、ピックアップし、プロセス(より速く、別のメモリ制限と実行時間持つことができます)あなたが利用できるのImageMagick APIを使用している場合

3

をすることができますPHPの設定 - それを使用してください! ImageMagickはPHPのmemory_limitでカウントされないため、より大きなファイルを扱うことができます。

あなたが本当にサーバーを制御することはできません場合は、迅速かつ非常に悪いの回避策がある - $ _POSTから画像ファイルを取得した後、最初に寸法をご確認ください:

<?php 
$image_size = getimagesize("yourfile.jpg") 
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA) 
if ($mem_usage > $mem_aviable) { 
    die ('Please upload smaller pic. I tell you that all the time. '. 
     'Resize yout huge 7MP images from your digital camera '. 
     'before uploading them.'); //Better put something more polite here. 
} 
+0

警告メッセージ":) –

1

ただ、彼らは小さいサイズを変更しますアップロードする前にMAX_FILE_SIZE

+0

これは動きません。画像は、(304KBのように)かなり小さいが、(2000x5700のような)多くのピクセルを持つかもしれない。 – Christian

0

GDを直接使用するPHPコードをデバッグしようとしていましたが、大規模なイメージや、GDを窒息させる小さなエラーがあるような画像のサブセットでは失敗しました。

しかし、私はphpThumb(http://phpthumb.sourceforge.net/)を見つけました。私は戻っていません。私のウェブディレクトリ(phpthumb.class.phpphpthumb.functions.php)への2つのPHPファイルを追加した後、私は私のサムネイルを生成するには、次のコードを使用することができました:

include("phpthumb.class.php"); 

// Load data into phpThumb object and set parameters 
$phpThumb = new phpThumb(); 
$phpThumb->setSourceData(file_get_contents($_GET['filename'])); 
$phpThumb->setParameter('w', $width); // Set width 
$phpThumb->setParameter('h', $height); // Set height 
$phpThumb->setParameter('zc', 1);  // Specify zoom-crop (instead of stretch) 
$phpThumb->setParameter('q', 100);  // Specify quality 

// Generate & output thumbnail 
$phpThumb->GenerateThumbnail();  // Generate the thumbnail 
$phpThumb->OutputThumbnail();   // Output it to browser 
$phpThumb->RenderToFile("$thumbname"); // Output it to file 
$phpThumb->purgeTempFiles();   // Clean up 

ブーム、魔法のように動作し、非常に高速で、大規模での問題がありませんファイル。また、サーバ上で利用可能なものに応じて、GDかImageMagickのどちらかを使うことができるので、比較的移植性があります。

+0

ps。 phpThumb.phpもあります。これは、クエリ文字列(および設定ファイル)の情報に基づいてサムネイルを直接作成しますが、これは私のニーズに合わないものです。 – Magnus

2

私はこの問題で数日間(そして夜間)立ち往生しました。

さらに、プロバイダのメモリの制限は、それぞれ異なります。 PHPのmemory_limitが共有サーバー上で動作しないという変更は、phpinfo()が128Mo(1and1はプロセスあたり60Moに制限されています)があると言っても、通常はRAMを制限します。

しかし、私は最終的にここに非常に効率的なものが見つかりました:それはimagemagick必要http://www.imagemagick.org/Usage/files/#massive

を、私はプロバイダのほとんどがネイティブに自分のサーバーでも共有するもので、これを提供することを発見しました。

exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg'); 

言われていたよう:(一種の)

  • nice -5をラムをシミュレートするためのimagemagick のための一時ディレクトリを設定

    • env MAGICK_TMPDIR=<tmp_dir>は、の優先順位を変更することもUNIXコマンドでありますプロセス (http://en.wikipedia.org/wiki/Nice_(Unix)

    • convert ...は本物を約-limit memory 32-limit map 32ある

    ImageMagickのコマンドラインです。これは、バイナリ(ここでは32Mo)が使用するメモリを制限する方法です。あなたはおそらくサーバの値に合うように値を合わせる必要があります(一般的に、PHPはあなたに致命的なエラーを与えたときに割り当てられた最大メモリを教えてくれますので、この値を2または4で割っておいてください。

    私もいくつかの担保の問題を回避するために、私のPHPでいくつかの他の行を置くために必要な:

    ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts 
    set_time_limit(0); // ignore server timeout 
    putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case 
    

    希望を助けることすべて...


    convertが上で利用できるかどうかを知りあなたのサーバーは、これを試すことができます(PHPで):

    $out = array(); 
    exec('which convert 2>&1', $out); 
    print_r($out); 
    

    hがバイナリの場合、存在する場合。

  • 関連する問題