0

私はギャラリーの構築に取り組んでおり、目標は参入障壁を低くすることです。私のユーザーは、デジタル カメラを使用して写真を撮る人なので、ファイル サイズは画像あたり 200 ~ 400 KB になります。

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

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 コードです。

$resource = NewMagickWand(); 
MagickReadImage($resource,$image); 
MagickSetImageCompressionQuality( $resource, 100);
$resource = MagickTransformImage($resource,'0x0','660x500');
MagickWriteImage($resource, $image);
DestroyMagickWand($resource);
4

3 に答える 3

2

http://pl.php.net/imagecreatefromjpeg

imagecreatefromjpeg() を使用して画像をロードするために必要なメモリは、画像のサイズと画像のビット深度にオーバーヘッドを掛けた関数です。次の式から計算できます: バイト数 = 幅 * 高さ * ピクセルあたりのバイト数 * オーバーヘッド ファッジ係数 ここで、ピクセルあたりのバイト数 = ビット深度/8、またはチャネルあたりのビット数 * チャネル数 / 8.

それはGDの部分についてです。今ImageMagick:より簡単なアプローチを試しましたか:

$thumb = new Imagick('image.jpg');
$thumb->resizeImage($w,$h,Imagick::FILTER_LANCZOS,1);
$thumb->writeImage('thumb.jpg');
$thumb->destroy(); 
于 2009-04-17T05:39:53.373 に答える
1

次のコードを php ファイルの先頭に配置してください。

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

于 2009-04-24T12:47:16.130 に答える
0

この質問については何も知りませんが、次の回答は役に立ちますか

写真のアップロードを処理する最良の方法は何ですか?

そうでない場合は、無視してください。

于 2009-04-17T06:56:01.863 に答える