загрузка файла — Почему качество изображения сильно ухудшается при изменении размера изображения даже после использования функций PHP GD?

Я изменяю размеры изображений, загружаемых пользователем, до определенного размера (то есть определенной ширины и высоты). Я хочу сделать загруженные изображения размерности 940 пикселей * 370 пикселей. Но при этом я не хочу влиять на качество изображения, изначально загруженного пользователем.

Проблема, с которой я сталкиваюсь в своем коде, заключается в том, что размеры изображения уменьшаются до указанных размеров, но качество изображения сильно ухудшается. Загруженные изображения уменьшаются.

Я не понимаю, как сохранить качество загруженного изображения без изменений

Для достижения этой функциональности я написал следующий код.

HTML-код:

<html>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

PHP-код:

<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

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"] < 5242880)
&& 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("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
} else {
//move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);

//Store the name of the temporary copy of the file stored on the server
$images = $_FILES["file"]["tmp_name"];

/*Create a new file name for uploaded image file :
*prepend the string "upload" to it's original file name
*/
$new_images = "upload".$_FILES["file"]["name"];

//Copies a file contents from one file to another
//copy($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]);

$width = 940;

//Determine the size of a given image file and return the dimensions along with the file type
$size=GetimageSize($images);

//$height=round($width*$size[1]/$size[0]);

$height = 370;

//Create a new image from file or URL & returns an image identifier representing the image obtained from the given filename.
$images_orig = ImageCreateFromJPEG($images);

//Get image width of originally uploaded image
$photoX = ImagesX($images_orig);

//Get image height of originally uploaded image
$photoY = ImagesY($images_orig);

//Create a new true color image & returns an image identifier representing a black image of the specified size.
$images_fin = ImageCreateTrueColor($width, $height);

/*Copy and resize part of an image with resampling
*copies a rectangular portion of one image to another image,
*smoothly interpolating pixel values so that, in particular,
*reducing the size of an image still retains a great deal of clarity.
*/
ImageCopyResampled($images_fin, $images_orig, 0, 0, 0, 0, $width+1, $height+1, $photoX, $photoY);

/*Output image to browser or file
*creates a JPEG file from the given image.
*/
ImageJPEG($images_fin,"upload/".$new_images);

/*Destroy an image
*frees any memory associated with image image.
*/
ImageDestroy($images_orig);
ImageDestroy($images_fin);

echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
} else {
echo "Invalid file";
}
?>

Было бы очень полезно для меня, если бы кто-то мог помочь мне в этом отношении.

Заранее спасибо.

Для более ясного понимания проблемы, с которой я сталкиваюсь, я прилагаю исходное изображение и измененное изображение, используя код PHP:

Исходное изображение выглядит следующим образом:
введите описание изображения здесь

Изображение после загрузки на сервер (т. Е. Поврежденное изображение) выглядит следующим образом:
введите описание изображения здесь

-2

Решение

Вместо того, чтобы всегда масштабировать изображение до 940×370, вы должны масштабировать его, чтобы сохранить соотношение сторон. Вы можете сделать это так:

$scaleX = $width / $photoX;
$scaleY = $height / $photoY;
$scale = min($scaleX, $scaleY);

$scaleW = $scale * $photoX;
$scaleH = $scale * $photoY;

$images_fin = ImageCreateTrueColor($width, $height);

$background = ImageColorAllocate($images_fin, 0, 0, 0);
ImageFill($images_fin, 0, 0, $background);

ImageCopyResampled($images_fin, $images_orig, $width / 2 - $scaleW / 2, $height / 2 - $scaleH / 2, 0, 0, $scaleW+1, $scaleH+1, $photoX, $photoY);

Это гарантирует, что полученное изображение всегда будет соответствовать размерам 940×370. Оставшаяся часть изображения (если соотношение сторон не соответствует 940 на 370) будет закрашена черным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]