110

フォームを介してアップロードされた画像のサイズを自動的に 147x147px に変更する PHP コードを書きたいのですが、その方法がわかりません (私は相対的な PHP 初心者です)。

これまでのところ、画像が正常にアップロードされ、ファイルの種類が認識され、名前がクリーンアップされましたが、サイズ変更機能をコードに追加したいと思います。たとえば、2.3MB でサイズが 1331x1331 のテスト画像があり、コードでサイズを縮小したいと考えています。これにより、画像のファイル サイズも劇的に圧縮されると思います。

これまでのところ、私は次のものを持っています:

if ($_FILES) {
                //Put file properties into variables
                $file_name = $_FILES['profile-image']['name'];
                $file_size = $_FILES['profile-image']['size'];
                $file_tmp_name = $_FILES['profile-image']['tmp_name'];
                
                //Determine filetype
                switch ($_FILES['profile-image']['type']) {
                    case 'image/jpeg': $ext = "jpg"; break;
                    case 'image/png': $ext = "png"; break;
                    default: $ext = ''; break;
                }
                
                if ($ext) {
                    //Check filesize
                    if ($file_size < 500000) {
                        //Process file - clean up filename and move to safe location
                        $n = "$file_name";
                        $n = ereg_replace("[^A-Za-z0-9.]", "", $n);
                        $n = strtolower($n);
                        $n = "avatars/$n";
                        move_uploaded_file($file_tmp_name, $n);
                    } else {
                        $bad_message = "Please ensure your chosen file is less than 5MB.";
                    }
                } else {
                    $bad_message = "Please ensure your image is of filetype .jpg or.png.";
                }
            }
$query = "INSERT INTO users (image) VALUES ('$n')";
mysql_query($query) or die("Insert failed. " . mysql_error() . "<br />" . $query);
4

13 に答える 13

165

画像を操作するには、PHP のImageMagickまたはGD関数を使用する必要があります。

たとえば、GD では、次のように簡単です...

function resize_image($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}

そして、この関数を次のように呼び出すことができます...

$img = resize_image(‘/path/to/some/image.jpg’, 200, 200);

個人的な経験から、GD の画像リサンプリングは、特に生のデジタル カメラ画像をリサンプリングする場合に、ファイル サイズも劇的に削減します。

于 2013-02-01T15:33:26.653 に答える
14

アスペクト比を気にしない場合(つまり、画像を特定の寸法に強制したい場合)、ここに簡単な答えがあります

// for jpg 
function resize_imagejpg($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromjpeg($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

 // for png
function resize_imagepng($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefrompng($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

// for gif
function resize_imagegif($file, $w, $h) {
   list($width, $height) = getimagesize($file);
   $src = imagecreatefromgif($file);
   $dst = imagecreatetruecolor($w, $h);
   imagecopyresampled($dst, $src, 0, 0, 0, 0, $w, $h, $width, $height);
   return $dst;
}

次に、アップロード部分を処理しましょう。最初のステップとして、ファイルを目的のディレクトリにアップロードします。次に、ファイル タイプ (jpg、png、または gif) に基づいて上記の関数のいずれかを呼び出し、アップロードしたファイルの絶対パスを次のように渡します。

 // jpg  change the dimension 750, 450 to your desired values
 $img = resize_imagejpg('path/image.jpg', 750, 450);

戻り値$imgはリソース オブジェクトです。以下のように、新しい場所に保存するか、元の場所を上書きできます。

 // again for jpg
 imagejpeg($img, 'path/newimage.jpg');

これが誰かに役立つことを願っています。Imagick::resizeImageimagejpeg()のサイズ変更の詳細については、これらのリンクを確認してください 。

于 2016-08-22T15:45:29.743 に答える
2

@Ian Atkin' が提供した回答の拡張版を次に示します。非常にうまく機能することがわかりました。より大きな画像の場合:)。注意しないと、実際には小さい画像を大きくすることができます。変更点: - jpg、jpeg、png、gif、bmp ファイルをサポート - .png および .gif の透明度を保持 - 元のサイズがまだ小さくなっていないかどうかを再確認 - 直接指定された画像を上書き (必要なもの)

それで、ここにあります。関数のデフォルト値は「黄金律」です

function resize_image($file, $w = 1200, $h = 741, $crop = false)
   {
       try {
           $ext = pathinfo(storage_path() . $file, PATHINFO_EXTENSION);
           list($width, $height) = getimagesize($file);
           // if the image is smaller we dont resize
           if ($w > $width && $h > $height) {
               return true;
           }
           $r = $width / $height;
           if ($crop) {
               if ($width > $height) {
                   $width = ceil($width - ($width * abs($r - $w / $h)));
               } else {
                   $height = ceil($height - ($height * abs($r - $w / $h)));
               }
               $newwidth = $w;
               $newheight = $h;
           } else {
               if ($w / $h > $r) {
                   $newwidth = $h * $r;
                   $newheight = $h;
               } else {
                   $newheight = $w / $r;
                   $newwidth = $w;
               }
           }
           $dst = imagecreatetruecolor($newwidth, $newheight);

           switch ($ext) {
               case 'jpg':
               case 'jpeg':
                   $src = imagecreatefromjpeg($file);
                   break;
               case 'png':
                   $src = imagecreatefrompng($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'gif':
                   $src = imagecreatefromgif($file);
                   imagecolortransparent($dst, imagecolorallocatealpha($dst, 0, 0, 0, 127));
                   imagealphablending($dst, false);
                   imagesavealpha($dst, true);
                   break;
               case 'bmp':
                   $src = imagecreatefrombmp($file);
                   break;
               default:
                   throw new Exception('Unsupported image extension found: ' . $ext);
                   break;
           }
           $result = imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
           switch ($ext) {
               case 'bmp':
                   imagewbmp($dst, $file);
                   break;
               case 'gif':
                   imagegif($dst, $file);
                   break;
               case 'jpg':
               case 'jpeg':
                   imagejpeg($dst, $file);
                   break;
               case 'png':
                   imagepng($dst, $file);
                   break;
           }
           return true;
       } catch (Exception $err) {
           // LOG THE ERROR HERE 
           return false;
       }
   }
于 2020-03-11T05:58:14.103 に答える
0

簡単な方法をお勧めします:

function resize($file, $width, $height) {
    switch(pathinfo($file)['extension']) {
        case "png": return imagepng(imagescale(imagecreatefrompng($file), $width, $height), $file);
        case "gif": return imagegif(imagescale(imagecreatefromgif($file), $width, $height), $file);
        default : return imagejpeg(imagescale(imagecreatefromjpeg($file), $width, $height), $file);
    }
}
于 2019-11-07T11:07:45.990 に答える