2009-04-17 17 views
0

私は建物のギャラリーで作業しており、目標は低い侵入障壁です。私のユーザーはデジタルカメラを使用して写真を撮る人物なので、ファイルサイズは画像あたり200〜400 KBです。デジタルカメラで撮影した画像をアップロード/サイズ変更するにはどうすればよいですか?

私がGDライブラリを使用して実行している問題は、各画像のサイズを変更してアップロードすると、サーバーに64 MBの制限がある場合、約90MBのメモリを使用することです。

ImageMagickを使用すると、タイムアウトして内部サーバーエラーがスローされます。

誰かがこのような大きな画像サイズをアップロード/サイズ変更した経験があり、私にいくつかの示唆を与えることができるのだろうかと思います。

おかげで、
レヴィ

編集:ここではここ

 /** Begin Multiple Image Upload**/  
     $numberImages = count($_FILES['galFile']['name'])-1; 

for($i=1;$i<=$numberImages;$i++) 
{ 
$imageName = $_FILES['galFile']['name'][$i]; 
      $imageType = $_FILES['galFile']['type'][$i]; 
      $imageSize = $_FILES['galFile']['size'][$i]; 
      $imageTemp = $_FILES['galFile']['tmp_name'][$i]; 
      $imageError = $_FILES['galFile']['error'][$i]; 

      //Make sure it is an image 
      if(in_array(end(explode(".", $imageName)), $allowed)) 
      { 
       //Where to upload image to 
       $uploadFile = $uploadDir . $imageName; 
       if (file_exists($uploadFile)) 
     { 
      //What to do if file already exists 
      //Append random number to the end 
      $front = explode(".", $imageName); 
      $randomNum = rand(1,100); 
      $front[0] = $front[0].$randomNum; 
      $imageName = $front[0].".".$front[1]; 
      $uploadFile = $uploadDir . $imageName; 
     } 
        if(move_uploaded_file($imageTemp,$uploadFile)) 
        { 
        //Add $imageName to DB 
        $query = "INSERT INTO galleryImages VALUES(\"0\",\"$lastInsert\",\"$imageName\",\"$i\")"; 
       mysql_query($query); 
       reSizePic($uploadFile); 
        } 
      } 
} 

をアップロードする私のコードは、私がサイズを変更するために使用されていたGDコードです:

function reSizePic($image) 
{ 
$source_pic = $image; 
$destination_pic = $image; 
$max_width = 660; 
$max_height = 500; 

$src = imagecreatefromjpeg($source_pic); 
list($width,$height)=getimagesize($source_pic); 

$x_ratio = $max_width/$width; 
$y_ratio = $max_height/$height; 

if(($width <= $max_width) && ($height <= $max_height)) 
{ 
    $tn_width = $width; 
    $tn_height = $height; 
} 
elseif (($x_ratio * $height) < $max_height) 
{ 
    $tn_height = ceil($x_ratio * $height); 
    $tn_width = $max_width; 
} 
else 
{ 
    $tn_width = ceil($y_ratio * $width); 
    $tn_height = $max_height; 
} 

$tmp = imagecreatetruecolor($tn_width,$tn_height); 

imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height); 

imagejpeg($tmp,$destination_pic,100); 
imagedestroy($src); 
imagedestroy($tmp); 
} 

そして、これはありますサイズ変更に使用しているImageMagickコード:

GDの一部についてです
+0

ImageMagickは問題なく400kbの画像を処理できるはずなので、非効率的な処理をしている可能性があります。一度に何人の人がサイズを変更しようとしていますか?コードを投稿できますか? –

+0

私はあなたがファイルを開いていると仮定していますが、閉じていないとか、それほど多くのメモリ使用量を得ることはできません。おそらくあなたのコードを投稿しますか? – Anthony

+0

私は200-400KBにあまり依存しません。最近では、3.2〜5メガピクセルの携帯電話カメラが一般的です。 – Blorgbeard

答えて

2

http://pl.php.net/imagecreatefromjpeg

The memory required to load an image using imagecreatefromjpeg() is a function of the image's dimensions and the images's bit depth, multipled by an overhead. It can calculated from this formula: Num bytes = Width * Height * Bytes per pixel * Overhead fudge factor Where Bytes per pixel = Bit depth/8, or Bits per channel * Num channels/8.

。今ImageMagickには:あなたは単純なアプローチしようとしている:、

$thumb = new Imagick('image.jpg'); 
$thumb->resizeImage($w,$h,Imagick::FILTER_LANCZOS,1); 
$thumb->writeImage('thumb.jpg'); 
$thumb->destroy(); 
+0

上記のImageMagickは機能しませんでした。 「致命的なエラー:クラス 'Imagick'が見つかりません」 私はHostgatorを使用していますが、Magickwandがインストールされています。これはMagickwandコマンドのみを使用できるのかどうか知っていますか? – Levi

+0

magickパッケージがインストールされていれば、docsのコメントからこの例をとりました。それはうまく動くと思います。 – zalew

+0

アップロードされた最初の15枚の画像の画像のサイズを変更しました。私が15以上をアップロードすると、それは終了しないので、それはサーバーと何らかの種類のタイムアウトと関係があると信じています。 – Levi

1

あなたのPHPファイルの上部に次のコードを記述してください。

ini_set( "memory_limit"、 "500M");

関連する問題