图片调整大小:JPEG质量差和PNG背景黑色化

3
最终决定基本使用这个:http://shiftingpixel.com/2008/03/03/smart-image-resizer/。它可以处理一切,我已经关闭了缓存并在管理控制器中执行此操作:
    $image = file_get_contents(SITE_ADMIN_IMAGE.'/SmartImage.php?width='.$this->thumb_width.'&height='.$this->thumb_height.'&image=/images/'.$this->image_directory.'/'.$formData['image_url'].'');
    file_put_contents(ROOT_PATH.'/public/images/'.$this->image_directory.'/thumb/'.$formData['image_url'], $image);

编辑:我发现这个方法可行,但是它会产生非常锐利的边缘,看起来不太自然。

    imagecolortransparent($dstImage, $background);
    imagealphablending($dstImage, false);
    $colorTransparent = imagecolorallocatealpha($dstImage, 0, 0, 0, 127);
    imagefill($dstImage, 0, 0, $colorTransparent);
    imagesavealpha($dstImage, true);
    imagepng($dstImage, $toWhere);

有什么想法吗?

你好,

我的课程有两个问题,基本上jpeg图像的质量相当差,但我不确定是否是由于我的比例调整造成的。理想情况下,我希望这个类在图像大小方面非常严格,并对它们进行裁剪,但我无法理解。

我主要的问题是png总是有黑色背景,有人遇到过这种情况吗?

<?php


    class OpenSource_ImageResize {


        function __construct($theFile, $toWhere, $mime, $extension, $newWidth, $newHeight) {

            if ($mime == NULL) {
                $mime = getimagesize($theFile);
                $mime = $mime['mime'];
            }


            if ($mime == 'image/jpeg') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefromjpeg($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    throw new exception('Could not create jpeg');
                    return false;
                }
            } else if ($mime == 'image/png') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefrompng($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    //throw new exception('Could not create png');
                    return false;
                }
            } else if ($mime == 'image/gif') {
                $size = getimagesize($theFile);

                if ($size[0] > $newWidth || $size[1] > $newHeight) {
                    $sourceImage = imagecreatefromgif ($theFile);
                } else {
                    return copy($theFile, $toWhere);
                    //throw new exception('Could not create gif');
                    return false;
                }
            } else {
                throw new exception('Not a valid mime type');
                return false;
            }

                $oldX = imageSX($sourceImage); 
                $oldY = imageSY($sourceImage); 

                if ($newWidth == NULL) {
                    $thumbHeight = $newHeight;
                    $thumbWidth = round($newHeight/($oldY/$oldX));
                } else 

                if ($oldX > $oldY) {
                    $thumbWidth = $newWidth; 
                    $thumbHeight = $oldY * ($newHeight/$oldX);
                } 

                if ($oldX < $oldY) {
                    $thumbWidth = round($newHeight/($oldY/$oldX));
                    $thumbHeight = $newHeight;
                }

                if ($oldX == $oldY) {
                    $thumbWidth = $newWidth; 
                    $thumbHeight = $newHeight;
                }

                    if (!gd_info()) {
                        $dstImage = ImageCreate($thumbWidth, $thumbHeight); 
                        imagecopyresized($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $oldX, $oldY);
                    } else {
                        $dstImage = ImageCreateTrueColor($thumbWidth, $thumbHeight); 
                        imagecopyresampled($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $oldX, $oldY);
                    } 

                    if ($mime == 'image/png') {
                        $xparent = imagecolorresolvealpha($dstImage, 255,2,240, 0) ;
                        imagecolortransparent($dstImage,$xparent);
                        imagealphablending($dstImage,true);
                        imagepng($dstImage, $toWhere);

                    } else if ($mime == 'image/jpeg') { 
                        imagejpeg($dstImage, $toWhere);

                    } else if ($mime == 'image/gif') {
                        imagegif ($dstImage, $toWhere);

                    }

                    imagedestroy($dstImage); 
                    imagedestroy($sourceImage);
                    return true;
        }

}
3个回答

2

关于JPEG图像质量,您需要使用imagejpeg()中的第三个参数:

imagejpeg($dstImage, $toWhere, 90); // any value above 85 should be fine

关于PNG透明度,你的处理方式不正确。你的脚本存在严重问题,需要进行修正。我将提供一个修订版,可以解决你遇到的两个问题。虽然仍有进一步优化的空间,但我选择保留你原始代码中较为次要的错误,以免使你感到困惑:

class OpenSource_ImageResize
{
    // $extension is not used?
    function __construct($theFile, $toWhere, $mime, $extension, $newWidth, $newHeight)
    {
        $sourceImage = ImageCreateFromString(file_get_contents($theFile));

        if (is_resource($sourceImage))
        {
            $info = getimagesize($theFile);

            if (is_null($mime))
            {
                $mime = $info['mime'];
            }

            if ($info[0] <= $newWidth && $info[1] <= $newHeight)
            {
                imagedestroy($sourceImage);
                return copy($theFile, $toWhere);
            }

            if (is_null($newWidth))
            {
                $thumbHeight = $newHeight;
                $thumbWidth = round($newHeight/($info[1]/$info[0]));
            }

            else if ($info[0] > $info[1])
            {
                $thumbWidth = $newWidth;
                $thumbHeight = $info[1] * ($newHeight/$info[0]);
            }

            if ($info[0] < $info[1])
            {
                $thumbWidth = round($newHeight/($info[1]/$info[0]));
                $thumbHeight = $newHeight;
            }

            if ($info[0] == $info[1])
            {
                $thumbWidth = $newWidth;
                $thumbHeight = $newHeight;
            }

            $dstImage = ImageCreateTrueColor($thumbWidth, $thumbHeight);

            /* fix PNG transparency issues */           
            ImageFill($dstImage, 0, 0, IMG_COLOR_TRANSPARENT);
            ImageSaveAlpha($dstImage, true);
            ImageAlphaBlending($dstImage, true);

            imagecopyresampled($dstImage, $sourceImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $info[0], $info[1]);

            switch ($mime)
            {
                case 'image/png':
                    imagepng($dstImage, $toWhere, 9); // compress it (level 1 to 9)
                break;

                case 'image/jpeg':
                    imagejpeg($dstImage, $toWhere, 90); // quality = 90 (1 to 100, default is "about" 75)
                break;

                case 'image/gif':
                    imagegif($dstImage, $toWhere);
                break;
            }

            imagedestroy($dstImage);
            imagedestroy($sourceImage);

            return true;
        }
    }
}

很抱歉我没有明确指出你的错误,但是它们实在太多了,现在已经是凌晨3点了,我需要休息一下。请好好学习并阅读手册,如果你有任何疑问,请让我知道。


-1

这个链接将带您访问一个简单的函数,该函数将根据其参数在调整大小期间执行裁剪或信封式处理图像。还有一个相当详细的说明,说明函数正在执行的操作。

http://www.spotlesswebdesign.com/blog.php?id=1

编辑:已修复链接。


-1

必须在你的类中定义PNG背景颜色。在定义背景颜色后,你也可以更改JPG和其他文件的背景颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接