изменить размер изображения в php без использования сторонних библиотек?

<p>в одном из моих приложений я использую фрагмент кода ниже, чтобы скопировать загруженные изображения в каталог. он работает нормально, но копирование больших изображений (> 2 мб) занимает больше времени, чем идеально, и мне действительно не нужны такие большие изображения, поэтому я ищу способ изменить размеры изображений. как этого добиться с помощью php?</p><pre><code><?php $uploaddirectory = 'images/0001/'; $randomnumber = rand(0, 99999); $filename = basename($\_files['userfile']['name']); $filepath = $uploaddirectory.md5($randomnumber.$filename); // check if the file was sent through http post. if (is\_uploaded\_file($_files['userfile']['tmp_name']) == true) { // validate the file size, accept files under 5 mb (~5e+6 bytes). if ($\_files['userfile']['size'] <= 5000000) { // move the file to the path specified. if (move\_uploaded\_file($_files['userfile']['tmp_name'], $filepath) == true) { // ... } } } ?> </code></pre>

<p>наконец, я нашел способ, который соответствует моим потребностям. следующий фрагмент изменяет размер изображения до указанной ширины, автоматически вычисляя высоту, чтобы сохранить пропорцию.</p><pre><code>$image = $\_files["image"]["tmp\_name"]; $resizeddestination = $uploaddirectory.md5($randomnumber.$filename)."\_resized.jpg"; copy($_files, $resizeddestination); $imagesize = getimagesize($image); $imagewidth = $imagesize[0]; $imageheight = $imagesize[1]; $desired_width = 100; $proportionalheight = round(($desired_width  $imageheight) / $imagewidth); $originalimage = imagecreatefromjpeg($image); $resizedimage = imagecreatetruecolor($desired_width, $proportionalheight); imagecopyresampled($images_fin, $originalimage, 0, 0, 0, 0, $desired_width+1, $proportionalheight+1, $imagewidth, $imageheight); imagejpeg($resizedimage, $resizeddestination); imagedestroy($originalimage); imagedestroy($resizedimage); </code></pre><p>для тех, кто ищет полный пример, создайте два файла:</p><pre><code><!-- send.html --> <html> <head> <title>simple file upload</title> </head> <body> <center> <div style="margin-top:50px; padding:20px; border:1px solid #cecece;"> select an image. <br/> <br/> <form action="receive.php" enctype="multipart/form-data" method="post"> <input type="file" name="image" size="40"> <input type="submit" value="send"> </form> </div> </center> </body> </code></pre><p></p><pre><code><?php // receive.php $randomnumber = rand(0, 99999); $uploaddirectory = "images/"; $filename = basename($\_files['file\_contents']['name']); $destination = $uploaddirectory.md5($randomnumber.$filename).".jpg"; echo "file path:".$filepath."<br/>"; if (is_uploaded_file($\_files["image"]["tmp\_name"]) == true) { echo "file successfully received through http post.<br/>"; // validate the file size, accept files under 5 mb (~5e+6 bytes). if ($_files['image']['size'] <= 5000000) { echo "file size: ".$\_files["image"]["size"]." bytes.<br/>"; // resize and save the image. $image = $\_files["image"]["tmp\_name"]; $resizeddestination = $uploaddirectory.md5($randomnumber.$filename)."\_resized.jpg"; copy($_files, $resizeddestination); $imagesize = getimagesize($image); $imagewidth = $imagesize[0]; $imageheight = $imagesize[1]; $desired_width = 100; $proportionalheight = round(($desired_width  $imageheight) / $imagewidth); $originalimage = imagecreatefromjpeg($image); $resizedimage = imagecreatetruecolor($desired_width, $proportionalheight); imagecopyresampled($images_fin, $originalimage, 0, 0, 0, 0, $desired_width+1, $proportionalheight+1, $imagewidth, $imageheight); imagejpeg($resizedimage, $resizeddestination); imagedestroy($originalimage); imagedestroy($resizedimage); // save the original image. if (move\_uploaded\_file($_files['image']['tmp_name'], $destination) == true) { echo "copied the original file to the specified destination.<br/>"; } } } ?> </code></pre>

<p>я сделал функцию изменения размера изображения наполовину, код ниже.</p><pre><code> function imgresize($path) { $x = getimagesize($path); $width = $x['0']; $height = $x['1']; $rs\_width = $width / 2;//resize to half of the original width. $rs\_height = $height / 2;//resize to half of the original height. switch ($x['mime']) { case "image/gif": $img = imagecreatefromgif($path); break; case "image/jpg": case "image/jpeg": $img = imagecreatefromjpeg($path); break; case "image/png": $img = imagecreatefrompng($path); break; } $img_base = imagecreatetruecolor($rs\_width, $rs_height); imagecopyresized($img\_base, $img, 0, 0, 0, 0, $rs\_width, $rs_height, $width, $height); $path\_info = pathinfo($path); switch ($path\_info['extension']) { case "gif": imagegif($img_base, $path); break; case "jpg": case "jpeg": imagejpeg($img_base, $path); break; case "png": imagepng($img_base, $path); break; } } </code></pre><p>и вы сможете вызвать функцию с ниже.</p><pre><code>$img = imgresize('c:/dir/image.png'); 

есть 1 очень простая функция изменения размера изображения для всех типов изображений, которая сохраняет прозрачность и очень проста в использовании проверять, выписываться : <a href="https://github.com/nimrod007/php_image_resize">https://github.com/nimrod007/php_image_resize надеюсь это поможет

 <a href="http://php.net/manual/en/imagick.resizeimage.php">imagemagick это самый быстрый и, вероятно, лучший способ изменить размер изображения в php. проверьте различные примеры <a href="http://www.imagemagick.org/usage/resize/">здесь . этот пример показывает, как <a href="http://www.rubblewebs.co.uk/imagemagick/codes/thumb.php">изменить размер и изображение при загрузке .

вы также можете использовать метод x  y/width для изменения размера и последующего вызова imagecopyresampled (), как показано на <a href="http://www.virtualsecrets.com/upload-resize-image-php-mysql.html">http://www.virtualsecrets.com/upload-resize-image-php-mysql.html эта страница также помещает изображения (после изменения размера) в mysql через pdo.

благодаря mateus nunes! я немного отредактировал его работу, чтобы заставить работать прозрачные pngs:$source = $_files["..."]["tmp_name"]; $destination = 'abc/def/ghi.png'; $maxsize = 45; $size = getimagesize($source); $width\_orig = $size[0]; $height\_orig = $size[1]; unset($size); $height = $maxsize+1; $width = $maxsize; while($height > $maxsize){ $height = round($width*$height_orig/$width\_orig); $width = ($height > $maxsize)?--$width:$width; } unset($width\_orig,$height_orig,$maxsize); $images_orig = imagecreatefromstring( file_get_contents($source) ); $photox = imagesx($images\_orig); $photoy = imagesy($images\_orig); $images_fin = imagecreatetruecolor($width,$height); imagesavealpha($images\_fin,true); $trans_colour = imagecolorallocatealpha($images\_fin,0,0,0,127); imagefill($images_fin,0,0,$trans\_colour); unset($trans_colour); imagecopyresampled($images\_fin,$images_orig,0,0,0,0,$width+1,$height+1,$photox,$photoy); unset($photox,$photoy,$width,$height); imagepng($images\_fin,$destination); unset($destination); imagedestroy($images_orig); imagedestroy($images\_fin); </code></pre>