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

Posted

技术标签:

【中文标题】PHP GD缩略图生成图像像素失真【英文标题】:PHP GD thumbnail generation image pixels distorted 【发布时间】:2014-10-24 17:29:10 【问题描述】:

我有一个 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);

【问题讨论】:

你试过用imagecopyresampled代替imagecopyresized吗? 不,我没有尝试过..但是imagecopyresized不同..? 相比imagecopyresized,通常效果更好,图像更流畅 【参考方案1】:

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

【讨论】:

【参考方案2】:

使用imagecopyresampled 而不是imagecopyresized 成功了..

原因:

imagecopyresized 将复制、缩放和图像。这使用了一种相当原始的算法,往往会产生更多像素化的结果。

imagecopyresampled 将复制和缩放图像,它使用平滑和像素插值算法,通常会产生比图像复制大小更好的结果,但会消耗少量 CPU。

【讨论】:

以上是关于PHP GD缩略图生成图像像素失真的主要内容,如果未能解决你的问题,请参考以下文章

GD图像处理——缩略图的实现

PHP GD&GET vars的图像缩略图

使用 php GD 创建 MP4 视频缩略图

PHP GD缩略图生成器0.1

缩略图在php中生成图像问题

GD创建图像缩略图