【问题标题】:PHP + GD: imagetruecolortopalette not keeping transparencyPHP + GD:imagetruecolortopalette 不保持透明度
【发布时间】:2011-02-07 00:23:55
【问题描述】:

我正在使用 GD 输出一个真彩色 + alpha 通道 PNG 文件的图像,使用 imagepng 就好了。但是,我也希望能够输出兼容 ie6 的 256 色 PNG。根据 imagetruecolortopalette 的官方文档:

代码已被修改,以在生成的调色板中保留尽可能多的 Alpha 通道信息,同时尽可能保留颜色。

但是,我发现此函数的结果根本无法正确保留任何透明度。我使用this firefox image 并在其上叠加文本作为测试,所有功能所做的只是给我一个白色背景和一个奇怪的深蓝色边框。我知道我不能希望保留完整的 alpha 通道,但这个功能肯定至少会在透明背景上起作用。有什么我想念的吗?我可以采取任何替代方法吗?

【问题讨论】:

    标签: php png gd


    【解决方案1】:

    查看 php 文档中的 imagesavealpha - 我认为这就是您要查找的内容。

    【讨论】:

    • 使用此功能关闭alpha通道并不能正确地将之前透明的部分图片变成透明颜色。
    【解决方案2】:

    我最近遇到了这样的事情 - 我只能通过使用来获得透明度:

    imagesavealpha($im, true);
    imagecolortransparent($im, imagecolorat($im,0,0));
    

    我知道在所有图像中,左上角的像素将是背景颜色。 这些是在 imagetruecolortopalette 之后和 imagepng 之前调用的。

    【讨论】:

    • 我试过了,它看起来不错,但由于某种原因,我 (WAMP) 安装上的 PNG 最终完全乱码。我还尝试将真实颜色转换为调色板 256 PNG 图像,同时保留单一 alpha 颜色。
    • 抱歉,这个结果似乎只在 Corel PhotoPaint 中打开时看起来很垃圾,而 Photoshop 看起来很好(包括透明度)。
    【解决方案3】:

    我能够通过在imagetruecolortopalette 之前保存像素来保持透明度

    function check_transparent($im) {
      $width = imagesx($im);
      $height = imagesy($im);
      $pixels = array();
      for($i = 0; $i < $width; $i++) {
          for($j = 0; $j < $height; $j++) {
              $rgba = imagecolorat($im, $i, $j);
              $index = imagecolorsforindex($im, $rgba);
              if($index['alpha'] == 127) {
                  $pixels[] = array($i, $j);
              }
          }
      }
      return $pixels;
    }
    

    然后替换为

    function replacePixels($im,$pixels){
      $color = imagecolorallocatealpha($im, 0, 0, 0, 127);
      foreach($pixels as $pixel)
          imagesetpixel($im, $pixel[0], $pixel[1], $color);
    }
    

    作为

    $tpixels = check_transparent($image);
    imagetruecolortopalette($image, true, 255);
    replacePixels($image, $tpixels);
    

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2013-08-26
      • 2012-03-29
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多