Проблема с изменением размера изображения в PHP – gd создает уродливые измененные изображения

Я создаю миниатюры фиксированной высоты и ширины из своего PHP-скрипта, используя следующую функцию

/*creates thumbnail of required dimensions*/ function createThumbnailofSize($sourcefilepath,$destdir,$reqwidth,$reqheight,$aspectratio=false) { /* * $sourcefilepath = absolute source file path of jpeg * $destdir = absolute path of destination directory of thumbnail ending with "/" */ $thumbWidth = $reqwidth; /*pixels*/ $filename = split("[/\\]",$sourcefilepath); $filename = $filename[count($filename)-1]; $thumbnail_path = $destdir.$filename; $image_file = $sourcefilepath; $img = imagecreatefromjpeg($image_file); $width = imagesx( $img ); $height = imagesy( $img ); // calculate thumbnail size $new_width = $thumbWidth; if($aspectratio==true) { $new_height = floor( $height * ( $thumbWidth / $width ) ); } else { $new_height = $reqheight; } // create a new temporary image $tmp_img = imagecreatetruecolor( $new_width, $new_height ); // copy and resize old image into new image imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height ); // save thumbnail into a file $returnvalue = imagejpeg($tmp_img,$thumbnail_path); imagedestroy($img); return $returnvalue; } 

и я вызываю эту функцию со следующими параметрами

 createThumbnailofSize($sourcefilepath,$destdir,48,48,false); 

но проблема заключается в том, что полученный образ очень низкого качества, когда я выполняю ту же операцию с магазином Adobe Photo, он выполняет хорошее преобразование .. почему это так? Я не могу найти какой-либо параметр качества, с помощью которого я меняю качество выходного изображения.

Используйте imagecopyresampled() вместо imagecopyresized() .

если это качество изображения после того, как вам нужно указать параметр качества при сохранении изображения с помощью imagejpeg ($ tmp_img, $ thumbnail_path, 100) // значение по умолчанию – 75

 /*creates thumbnail of required dimensions*/ function createThumbnailofSize($sourcefilepath,$destdir,$reqwidth,$reqheight,$aspectratio=false) { /* * $sourcefilepath = absolute source file path of jpeg * $destdir = absolute path of destination directory of thumbnail ending with "/" */ $thumbWidth = $reqwidth; /*pixels*/ $filename = split("[/\\]",$sourcefilepath); $filename = $filename[count($filename)-1]; $thumbnail_path = $destdir.$filename; $image_file = $sourcefilepath; $img = imagecreatefromjpeg($image_file); $width = imagesx( $img ); $height = imagesy( $img ); // calculate thumbnail size $new_width = $thumbWidth; if($aspectratio==true) { $new_height = floor( $height * ( $thumbWidth / $width ) ); } else { $new_height = $reqheight; } // create a new temporary image $tmp_img = imagecreatetruecolor( $new_width, $new_height ); // copy and resize old image into new image imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height ); // save thumbnail into a file $returnvalue = imagejpeg($tmp_img,$thumbnail_path,100); imagedestroy($img); return $returnvalue; 

}

Вы также можете использовать ImageMagick ( http://us3.php.net/manual/en/book.imagick.php ) вместо Gd. У меня была такая же проблема всего пару дней назад с Java. Переход к ImageMagick вместо Java Advanced Images приводит к огромной разнице в качествах.

Вы также можете взглянуть на пакет Image_Transform PEAR . Он заботится о многих деталях низкого уровня для вас и делает создание и maniuplating изображений безболезненными. Он также позволяет использовать библиотеки GD или ImageMagick. Я использовал его с большим успехом в нескольких проектах.

попробовал использовать php.Thumbnailer ?

 $thumb=new Thumbnailer("photo.jpg"); $thumb->thumbSquare(48)->save("thumb.jpg"); 

Результат будет 48x48px. Легко ли? 🙂