在不使用第三方库的情况下在 PHP 中调整图像大小?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9650572/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Resize images in PHP without using third-party libraries?
提问by Mateus
In one of my applications, I'm using the code snippet below to copy uploaded images to a directory. It works fine but copying large images (> 2MB) takes more time than ideal and I really don't need images this big, so, I'm looking for a way to resize the images. How to achieve this using PHP?
在我的一个应用程序中,我使用下面的代码片段将上传的图像复制到目录中。它工作正常,但复制大图像(> 2MB)比理想情况需要更多的时间,我真的不需要这么大的图像,所以,我正在寻找一种调整图像大小的方法。如何使用 PHP 实现这一目标?
<?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) {
// ...
}
}
}
?>
回答by Mateus
Finally, I've discovered a way that fit my needs. The following snippet will resize an image to the specified width, automatically calculating the height in order to keep the proportion.
最后,我发现了一种适合我需求的方法。以下代码段将图像调整为指定的宽度,自动计算高度以保持比例。
$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);
To anyone else seeking a complete example, create two files:
对于寻求完整示例的其他人,请创建两个文件:
<!-- 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>
<?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/>";
}
}
}
?>
回答by Jake
I made a function to resize the image by half, the code is below.
我做了一个将图像大小调整一半的函数,代码如下。
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;
}
}
and you would be able to call the function with below.
并且您可以在下面调用该函数。
$img = imgResize('c:/dir/image.png');
回答by Nimrod007
there is 1 very simple image re-size function for all image types that keeps transparency and is very easy to use
所有图像类型都有 1 个非常简单的图像大小调整功能,可保持透明度且非常易于使用
check out :
查看 :
https://github.com/Nimrod007/PHP_image_resize
https://github.com/Nimrod007/PHP_image_resize
hope this helps
希望这可以帮助
回答by Chibueze Opata
ImageMagickis the fastest and probably the best way to resize images in PHP. Check out different examples here. This sample shows how to resize and image on upload.
ImageMagick是在 PHP 中调整图像大小的最快且可能是最好的方法。在此处查看不同的示例。此示例显示如何在上传时调整大小和图像。
回答by FellowCoder
You could also use an x*y/width method for resizing and then calling imagecopyresampled() like is shown at http://www.virtualsecrets.com/upload-resize-image-php-mysql.htmlThat page also puts images (after resizing) into mySQL via the PDO.
您还可以使用 x*y/width 方法来调整大小,然后调用 imagecopyresampled() 就像http://www.virtualsecrets.com/upload-resize-image-php-mysql.html显示的 那样 该页面还放置了图像(调整大小后)通过 PDO 进入 mySQL。
回答by cottton
Thanks to Mateus Nunes! i edited his work a bit to get transparent pngs working:
感谢 Mateus Nunes!我稍微编辑了他的作品以使透明的 png 工作:
$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);