php GD图像调整为较小的新图像 - >模糊的问题

时间:2010-05-09 20:57:59

标签: php

我正在缩小从200px宽到190px宽的图像,this class

这是我得到的alt text http://i40.tinypic.com/5as7eo.jpg

img 1 =原创 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - img 2 =较小

我尝试了几种不同的宽度但是我得到了与所有图像尺寸相同的锐度/模糊度损失。我的质量设置为100(最大)

5 个答案:

答案 0 :(得分:5)

我找到了这个解决方案,它适用于我,我已经在我的Facebook墙上(https://www.facebook.com/antimatterstudios/posts/10151207306454364

我今天在网上找到的一个不错的小提示(Facebook墙有直接链接),对于那些使用php的GD库来调整​​图像大小并发现图像大小和模糊的人,你可以使用这一小段代码来提高图像,它好多了

 function imagesharpen( $image)
 {
    $matrix = array(
      array(-1, -1, -1),
      array(-1, 16, -1),
      array(-1, -1, -1),
    );

    $divisor = array_sum(array_map('array_sum', $matrix));
    $offset = 0; 
    imageconvolution($image, $matrix, $divisor, $offset);

    return $image;
}

答案 1 :(得分:1)

您使用imagecopyresampled或imagecopyresized的方法是什么? imagecopyresampled可以提供更好的结果。如果可能,还要考虑Imagemagick库:http://pecl.php.net/package/imagick

答案 2 :(得分:0)

你尝试过使用timthumb吗?

http://code.google.com/p/timthumb/source/browse/trunk/timthumb.php

解决同样的问题,以此为基础。

答案 3 :(得分:0)

只需将imagecopyresampled()改为imagecopyresized()就可以了。适合我。

答案 4 :(得分:0)

这是GD的双三次调整大小。它采用与标准ImageCopyResampled函数相同的参数。
它给出的结果要清晰得多,尤其是源分辨率接近目标分辨率时。
但是,当然,它比标准GD慢得多,ImageMagic显然可以提供更好的结果。

    function ImageCopyResampledBicubic(&$dst_image, &$src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)  {
    // we should first cut the piece we are interested in from the source
    $src_img = ImageCreateTrueColor($src_w, $src_h);
    imagecopy($src_img, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h);

    // this one is used as temporary image
    $dst_img = ImageCreateTrueColor($dst_w, $dst_h);

    ImagePaletteCopy($dst_img, $src_img);
    $rX = $src_w / $dst_w;
    $rY = $src_h / $dst_h;
    $w = 0;
    for ($y = 0; $y < $dst_h; $y++)  {
        $ow = $w; $w = round(($y + 1) * $rY);
        $t = 0;
        for ($x = 0; $x < $dst_w; $x++)  {
            $r = $g = $b = 0; $a = 0;
            $ot = $t; $t = round(($x + 1) * $rX);
            for ($u = 0; $u < ($w - $ow); $u++)  {
                for ($p = 0; $p < ($t - $ot); $p++)  {
                    $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $ot + $p, $ow + $u));
                    $r += $c['red'];
                    $g += $c['green'];
                    $b += $c['blue'];
                    $a++;
                }
            }
            ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a));
        }
    }

    // apply the temp image over the returned image and use the destination x,y coordinates
    imagecopy($dst_image, $dst_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h);

    // we should return true since ImageCopyResampled/ImageCopyResized do it
    return true;
}