【问题标题】:PHP Reducing all image types quality [closed]PHP降低所有图像类型的质量[关闭]
【发布时间】:2012-11-25 22:09:41
【问题描述】:

我正在寻找一个可以降低所有图像类型质量(PNG、GIF 和 JPEG)的库。
我知道我可以使用 imagejpeg()
减少 JPEG 我也知道我可以使用 imagepng() 减少 PNG,虽然这还不够强大。

我需要一些可以在不删除 alpha 的情况下将 PNG 24 转换为 PNG8 的东西。

无法使用 ImageMagick,因为我无法在我的服务器上安装任何东西。

编辑:
我还需要可以从 32 位转换为 8 位的东西(我很确定与 32 位相同)

找到灵魂here

谢谢

【问题讨论】:

  • 也许我遗漏了一些东西,但是根据定义从 PNG24 转换为 PNG8 会删除 alpha 数据。
  • 不,你完全正确。 PNG8 是没有 Alpha 的 PNG。它只是组合了 RBG 通道,没有单独的 R G B + Alpha 通道。
  • 这里的人非常误会。我有许多带有 alpha 数据的 PNG8 图像(灰度图像)。
  • @Ron,我知道你不是。看起来他们认为 PNG 总是需要一个完整的 alpha 通道(因此是 PNG X+8)来获得 alpha 数据。这是一个非常简单的带有 alpha 的 PNG8 示例(如果由于某种原因似乎不可能,我可以上传 PNG8 的颜色版本并包含 alpha 数据):s16.postimage.org/lkbjf58kh/gearsgrayscale.png
  • 检查TinyPng——他们在做几乎相同的事情。您可以轻松创建一个脚本,将图像发送到他们的服务,然后将其取回。如果您觉得这听起来很有趣,我可以提供示例代码。

标签: php image compression image-compression


【解决方案1】:

我知道你不想要 GD 库,但使用以下代码:

$img = imagecreatefrompng($src);
imagesavealpha($img, true);
imagepng($img, $dst, 9, PNG_ALL_FILTERS);
imagedestroy($img);

优化后的图片比原来的尺寸小了约40%,alpha没有被去除。

您希望进行多少百分比的优化?

【讨论】:

  • 这只是压缩图像并保存 alpha,但与图像的原始位一起保存。在不应用任何过滤器的情况下将图像保存为 png 8 将其大小至少减小 65%(在 Photoshop 中检查)。
【解决方案2】:

请试试这个,这是你要找的结果吗?

<?php
$size = getimagesize("original.png");
$source = imagecreatefrompng("original.png");
$target = imagecreate($size[0], $size[1]);
imagecopy($target, $source, 0, 0, 0, 0, $size[0], $size[1]);
imagepng($target,"copy.png");  

【讨论】:

    【解决方案3】:

    根据我使用 PHP 的经验,我在图像处理(使用 GD,标准库)方面总是遇到一些困难。
    我相信没有任何 PHP 扩展是没有说明的。我建议你使用一些有助于工作的扩展,例如:ImageMagick

    安装扩展后,尝试以下操作:

    # Load your image
    $im = new Imagick('your-png32-image.png'); 
    # Set quality/colors
    $im->setImageFormat('PNG8');
    $colors = min(255, $im->getImageColors());
    $im->quantizeImage($colors, Imagick::COLORSPACE_RGB, 0, false, false);
    # 8bits
    $im->setImageDepth(8);
    # Save image
    $im->writeImage('your-png8-image.png');
    

    【讨论】:

      【解决方案4】:

      要将任何 PNG 图像转换为 8 位 PNG,请使用我刚刚创建的此函数

      function convertPNGto8bitPNG()
      
        function convertPNGto8bitPNG($sourcePath, $destPath) {
          $srcimage = imagecreatefrompng($sourcePath);
          list($width, $height) = getimagesize($sourcePath);
          $img = imagecreatetruecolor($width, $height);
          $bga = imagecolorallocatealpha($img, 0, 0, 0, 127);
          imagecolortransparent($img, $bga);
          imagefill($img, 0, 0, $bga);
          imagecopy($img, $srcimage, 0, 0, 0, 0, $width, $height);
          imagetruecolortopalette($img, false, 255);
          imagesavealpha($img, true);
          imagepng($img, $destPath);
          imagedestroy($img);
          }
      

      参数

      $sourcePath - 源 PNG 文件的路径 $destPath - 目标 PNG 文件的路径 用法

      convertPNGto8bitPNG('pfc.png', 'pfc8bit.png');
      

      【讨论】:

        猜你喜欢
        • 2019-08-23
        • 2017-08-03
        • 1970-01-01
        • 2016-06-06
        • 2010-11-12
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多