如何使用PHP以最佳方式将用户上传的图像重新调整为特定尺寸(不影响上传图像的质量)?

如何使用PHP以最佳方式将用户上传的图像重新调整为特定尺寸(不影响上传图像的质量)?,php,file-upload,image-uploading,image-resizing,php-gd,Php,File Upload,Image Uploading,Image Resizing,Php Gd,我正在为我的网站使用PHP、jQuery、AJAX、HTML等。我是PHP的新手 我在我的WebApp中使用了一个jQuery图像滑块。对于此图像滑块,用户上载图像。此外,这些上传的图像将显示在此图像滑块中。这个功能对我来说很好 此图像滑块的固定宽度和高度为940 px*370 px。我想允许用户上传其尺寸应大于或等于940像素*370像素的图像 假设用户上传了尺寸为2215px*875px的图像,那么在上传到服务器之前,这个图像应该重新调整尺寸为940px*370px。将映像保存到服务器之前。

我正在为我的网站使用PHP、jQuery、AJAX、HTML等。我是PHP的新手

我在我的WebApp中使用了一个jQuery图像滑块。对于此图像滑块,用户上载图像。此外,这些上传的图像将显示在此图像滑块中。这个功能对我来说很好

此图像滑块的固定宽度和高度为940 px*370 px。我想允许用户上传其尺寸应大于或等于940像素*370像素的图像

假设用户上传了尺寸为2215px*875px的图像,那么在上传到服务器之前,这个图像应该重新调整尺寸为940px*370px。将映像保存到服务器之前。只有在将上传的图像大小重新调整为940 px*370 px后,才应将其保存到服务器

在重新调整大小的过程中,图像质量不得受到影响。重新调整大小的图像应该看起来像用户上传的原始图像。它不应该在任何意义上收缩或拉伸

如何通过使用PHP GD和图像函数以最佳方式实现此功能

以下是我尝试的文件上传功能代码,供您参考:

HTML代码:

PHP代码:


您可以在服务器上使用imagemagick命令行工具或使用

ImageMagick的更多信息链接-

PHP GD库的信息链接-

使用下面的命令转换图像-

$w = 940;
$h = 370;
$temp_path = $_FILES["file"]["tmp_name"];
$dest_path = "upload/" . $_FILES["file"]["name"];
shell_exec("/usr/bin/convert -resize \"$w"."X".$h.">\"  $dest_path  $temp_path");
使用下面的PHP GD代码-

            <?php
$uploadPath = "/var/www/stack/26201855/upload/";
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
$imageType = "";
if(strpos($_FILES["file"]["type"],'jpeg') || strpos($_FILES["file"]["type"],'jpg') || strpos($_FILES["file"]["type"],'pjpeg')){
$imageType = "jpeg";
}else if(strpos($_FILES["file"]["type"],'png') || strpos($_FILES["file"]["type"],'x-png')){
$imageType = "png";
}else if(strpos($_FILES["file"]["type"],'gif')){
$imageType = "gif";
}

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 200000)
&& in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists($uploadPath . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
} else {
//move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
$images = $_FILES["file"]["tmp_name"];
$new_images = $uploadPath.$_FILES["file"]["name"];
copy($images,$new_images);
$width=940;
$size=GetimageSize($images);
$height=round($width*$size[1]/$size[0]);
if($imageType === 'jpeg'){
$images_orig = imagecreatefromjpeg($images);
}else if($imageType === 'png'){
$images_orig = imagecreatefrompng($images);
}else if($imageType === 'gif'){
$images_orig = imagecreatefromgif($images);
}
$photoX = ImagesX($images_orig);
$photoY = ImagesY($images_orig);
$images_fin = ImageCreateTrueColor($width, $height);
ImageCopyResampled($images_fin, $images_orig, 0, 0, 0, 0, $width+1, $height+1, $photoX, $photoY);
if($imageType === 'jpeg'){
imagejpeg($images_fin,$new_images);
}else if($imageType === 'png'){
imagepng($images_fin,$new_images);
}else if($imageType === 'gif'){
imagegif($images_fin,$new_images);
}


ImageDestroy($images_orig);
ImageDestroy($images_fin);
echo "Stored in: " . $uploadPath. $_FILES["file"]["name"];
}
}
} else {
echo "Invalid file";
} 
?>

注意:您必须自行决定哪种方法可以方便地调整图像大小。

您可以使用imageMagick转换图像。请查看url,谢谢您的回答。但对我来说,这听起来很棘手。难道没有其他更简单的方法来实现这一点吗?安装第三方库,使用命令行工具是有点乏味的工作。我想避免它们。如果我使用第二种方法PHP GD库,我是否需要导入任何文件、安装任何扩展或创建一些对象等,或者编写您在答案中给出的代码就足够了?让我们来看看。我已经更新了答案。路径中存在问题。请尝试学习如何调试。复制[文件][tmp_名称],上载/$_文件[文件][名称];上载/$\u文件[文件][名称];,而不是复制$\u文件;。现在您可以使用文件中的答案代码。
$w = 940;
$h = 370;
$temp_path = $_FILES["file"]["tmp_name"];
$dest_path = "upload/" . $_FILES["file"]["name"];
shell_exec("/usr/bin/convert -resize \"$w"."X".$h.">\"  $dest_path  $temp_path");
            <?php
$uploadPath = "/var/www/stack/26201855/upload/";
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
$imageType = "";
if(strpos($_FILES["file"]["type"],'jpeg') || strpos($_FILES["file"]["type"],'jpg') || strpos($_FILES["file"]["type"],'pjpeg')){
$imageType = "jpeg";
}else if(strpos($_FILES["file"]["type"],'png') || strpos($_FILES["file"]["type"],'x-png')){
$imageType = "png";
}else if(strpos($_FILES["file"]["type"],'gif')){
$imageType = "gif";
}

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 200000)
&& in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists($uploadPath . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
} else {
//move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
$images = $_FILES["file"]["tmp_name"];
$new_images = $uploadPath.$_FILES["file"]["name"];
copy($images,$new_images);
$width=940;
$size=GetimageSize($images);
$height=round($width*$size[1]/$size[0]);
if($imageType === 'jpeg'){
$images_orig = imagecreatefromjpeg($images);
}else if($imageType === 'png'){
$images_orig = imagecreatefrompng($images);
}else if($imageType === 'gif'){
$images_orig = imagecreatefromgif($images);
}
$photoX = ImagesX($images_orig);
$photoY = ImagesY($images_orig);
$images_fin = ImageCreateTrueColor($width, $height);
ImageCopyResampled($images_fin, $images_orig, 0, 0, 0, 0, $width+1, $height+1, $photoX, $photoY);
if($imageType === 'jpeg'){
imagejpeg($images_fin,$new_images);
}else if($imageType === 'png'){
imagepng($images_fin,$new_images);
}else if($imageType === 'gif'){
imagegif($images_fin,$new_images);
}


ImageDestroy($images_orig);
ImageDestroy($images_fin);
echo "Stored in: " . $uploadPath. $_FILES["file"]["name"];
}
}
} else {
echo "Invalid file";
} 
?>