【问题标题】:Creating an image with PHP - Large file size使用 PHP 创建图像 - 大文件
【发布时间】:2012-12-10 11:03:45
【问题描述】:

问题

我正在尝试将 260x310 像素的 PNG 调整为 120x120 像素,同时保持透明度并使图像居中。我在下面包含了我正在使用的功能,它在图像外观方面工作得很好,但是创建的图像要大得多。事实上,所有图像看起来都是 128kb(有数千张我还没有看过),尽管图像大小超过一半(以像素为单位),但包含 50,000 张这些图像的目录要大 1gb。

我想这是因为 PHP 没有像 Photoshop 那样做任何优化。我可以做些什么来优化 PHP 中的图像?

代码

这是我的代码:

if ($handle = opendir($mydir_path)) {
    while (false !== ($entry = readdir($handle))) {
        if(strpos($entry, '.png'))
        {
            resize($mydir_path.$entry);
        }
    }
    closedir($handle);
}

function resize($img_loc)
{
    $mini_loc = str_replace('megapack', 'handheld_megapack', $img_loc);

    $canvas = imagecreatetruecolor(310, 310);
    imagefill($canvas, 0, 0, imagecolorallocatealpha($canvas, 255, 255, 255, 127));
    imagealphablending($canvas, false);
    imagesavealpha($canvas, true);

    $img = imagecreatefrompng($img_loc);
    imagecopy($canvas, $img, 25, 0, 0, 0, 260, 310);

    $resizedImg = imagecreatetruecolor('120', '120');
    imagefill($resizedImg, 0, 0, imagecolorallocatealpha($resizedImg, 255, 255, 255, 127));
    imagealphablending($resizedImg, false);
    imagesavealpha($resizedImg, true);

    imagecopyresampled($resizedImg, $canvas, 0, 0, 0, 0, '120', '120', '310', '310');

    $dirname = dirname($mini_loc);

    imagepng($resizedImg, $mini_loc, '0');

    chmod($mini_loc, 0666);

    return $mini_loc;
}

【问题讨论】:

    标签: php image-processing png image-resizing imagecreatefrompng


    【解决方案1】:

    虽然可以使用 PHP 优化文件,但通过像 pngcrush 这样的程序运行它是最简单的。

    使用 GD,您可以尝试使用 imagepng“质量”的第三个参数并将其设置为 9(您已将其设置为 0 = 不压缩),但使用专门的 PNG 优化器会获得更多收益。

    也检查这个问题:PNG optimisation tools

    【讨论】:

    • 我一直在研究 pngcrush,它可能是解决方案。我会给你一个 +1,但希望有人会对优化 PHP 生成的图像提供一些见解:)
    • 谢谢,我已经扩展了我的答案。
    • 啊该死的,这似乎太明显了!这大大减少了文件大小,只有 20kb,并且没有明显的质量损失。
    • 也是用pngcrush对9次优化不到1kb的图片后保存的,看来9次优化就够了
    • 是的,做了一个 3gb 的 dir 1gb,没有明显的质量损失。答案太明显了,我有点不好意思!
    猜你喜欢
    • 2018-05-22
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2021-02-19
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多