У меня есть сценарий PHP, который сохраняет исходный образ, затем изменяет размер его - одна миниатюра и одно увеличенное изображение для веб-просмотра. Это работает хорошо кроме с некоторыми изображениями, качество ужасно. Это, кажется, сохраняется с очень низкой цветной панелью. Вы видите, что результат по http://kalpaitch.com/index.php?filter=white - нажимает на первую миниатюру с заголовком 'белый белый белый'
Ниже код, используемый для передискретизации изображения:
function resizeImg($name, $extension, $size1, $size2) {
if (preg_match('/jpg|jpeg|JPG|JPEG/',$extension)){
$image = imagecreatefromjpeg($name);
}
if (preg_match('/gif|GIF/',$extension)){
$image = imagecreatefromgif($name);
}
$old_width = imageSX($image);
$old_height = imageSY($image);
$old_aspect_ratio = $old_width/$old_height;
if($size2 == 0){
$new_aspect_ratio = $old_aspect_ratio;
if($old_width > $old_height){
$new_width = $size1;
$new_height = $new_width / $old_aspect_ratio;
} else {
$new_height = $size1;
$new_width = $new_height * $old_aspect_ratio;
}
} elseif($size2 > 0){
$new_aspect_ratio = $size1/$size2;
//for landscape potographs
if($old_aspect_ratio >= $new_aspect_ratio) {
$x1 = round(($old_width - ($old_width * ($new_aspect_ratio/$old_aspect_ratio)))/2);
$old_width = round($old_width * ($new_aspect_ratio/$old_aspect_ratio));
$y1 = 0;
$new_width = $size1;
$new_height = $size2;
//for portrait photographs
} else{
$x1 = 0;
$y1 = 0;
$old_height = round($old_width/$new_aspect_ratio);
$new_width = $size1;
$new_height = $size2;
}
}
$new_image = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image, $image, 0, 0, $x1, $y1, $new_width, $new_height, $old_width, $old_height);
return $new_image;
Большое спасибо
P.S. [фотографии, удаленные из сервера]
И вот остальная часть кода загрузки:
// Move the original to the right place
$result = @move_uploaded_file($image['tmp_name'], $origlocation);
// Resize the image and save the thumbnail
$new_image = resizeImg($origlocation, $extension, 500, 0);
if (preg_match("/gif/",$extension)){
imagegif($new_image, $normallocation);
} else {
imagejpeg($new_image, $normallocation);
}
// Resize the image and save the thumbnail
$new_image = resizeImg($origlocation, $extension, 190, 120);
if (preg_match("/gif/",$extension)){
imagegif($new_image, $thumblocation);
} else {
imagejpeg($new_image, $thumblocation);
}
Потеря качества связана не с imagecopyresampled ()
, а с сжатием JPEG. К сожалению, алгоритмы сжатия GD не совпадают с алгоритмами Photoshop - на самом деле их очень мало. Но вы можете улучшить результат: уровень сжатия JPG GD по умолчанию составляет 75 из 100.
Вы можете повысить качество, используя третий параметр до imagejpeg () (который, я полагаю, вы используете для окончательного вывода ):
imagejpeg ( $new_image, null, 99);
Поиграйте в диапазоне 90-100. Изображение станет больше по размеру файла, чем оригинал - это будет цена, которую вы заплатите. Но должно быть возможно достичь сопоставимого качества.
В качестве альтернативы, как уже сказал в комментариях Джон Химмельман, попробуйте использовать imagepng ()
для лучшего качества - также, конечно, за счет значительно большего размера файла.
Что ж, документация php.net говорит, что вам нужно иметь изображение imagecreatetruecolor () для вашего dest_image, если вы не хотите использовать только 255 цветную палитру, но вы уже это делаете.
Думаю, альтернативой было бы использование внешних инструментов, таких как imagemagick с вызовом system ().