PHP GD缩略图生成图像像素失真

时间:2014-08-31 07:00:50

标签: php image-processing gd thumbnails

我使用PHP脚本来使用PHP GD库在图像上传时生成缩略图。

缩略图的高度是固定的(在本例中为 240px ),其宽度将根据原始图像的宽高比计算。 恩。

$new_height = $thumbHeight;
$new_width = intval($thumbHeight * $width / $height);

但在某些图像中,输出缩略图图像的像素失真。下面的图片清楚地解决了我的问题。

Exaple Image

生成缩略图后输出图像(),但我希望输出图像在正确

我的代码:

$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);

2 个答案:

答案 0 :(得分:2)

使用imagecopyresampled()函数而不是imagecopyresized()通常会使渲染图像更加平滑,因此在这种情况下,它可能就是解决方案。

答案 1 :(得分:0)

使用imagecopyresampled代替imagecopyresized完成了这个技巧..

原因:

imagecopyresized将复制并缩放和成像。这使用了一种相当原始的算法,可以产生更多的像素化结果。

imagecopyresampled将复制并缩放和成像,它使用平滑和像素插值算法,通常会产生更好的结果,然后以少量CPU使用为代价进行图像复制。