我使用PHP脚本来使用PHP GD库在图像上传时生成缩略图。
缩略图的高度是固定的(在本例中为 240px ),其宽度将根据原始图像的宽高比计算。 恩。
$new_height = $thumbHeight;
$new_width = intval($thumbHeight * $width / $height);
但在某些图像中,输出缩略图图像的像素失真。下面的图片清楚地解决了我的问题。
生成缩略图后输出图像(左),但我希望输出图像在正确
中我的代码:
$file = "pic.jpg";
$thumbHeight = 240;
$progressive = false;
$img;
if(preg_match('/[.](jpg)$/', $file)) {
$img = imagecreatefromjpeg($file);
} else if (preg_match('/[.](gif)$/', $file)) {
$img = imagecreatefromgif($file);
} else if (preg_match('/[.](png)$/', $file)) {
$img = imagecreatefrompng($file);
} else if(preg_match('/[.](jpeg)$/', $file)) {
$img = imagecreatefromjpeg($file);
}
$arr_image_details = getimagesize($file);
$width = $arr_image_details[0]; // width of input image
$height = $arr_image_details[1]; // height of input image
$new_height = $thumbHeight; // new thumbnail height
$new_width = intval($thumbHeight * $width / $height); // new thumbnail width
$tmp_img = imagecreatetruecolor( $new_width, $new_height );
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
if($progressive) imageinterlace($tmp_img, 1);
imagejpeg( $tmp_img, "lag-$file",100 );
imagedestroy($img);
imagedestroy($tmp_img);
答案 0 :(得分:2)
使用imagecopyresampled()
函数而不是imagecopyresized()
通常会使渲染图像更加平滑,因此在这种情况下,它可能就是解决方案。
答案 1 :(得分:0)
使用imagecopyresampled
代替imagecopyresized
完成了这个技巧..
原因:
imagecopyresized
将复制并缩放和成像。这使用了一种相当原始的算法,可以产生更多的像素化结果。
imagecopyresampled
将复制并缩放和成像,它使用平滑和像素插值算法,通常会产生更好的结果,然后以少量CPU使用为代价进行图像复制。