我的PNG具有透明度,但在使用PHP GD保存后,透明度会丢失

时间:2011-11-13 01:50:59

标签: php image png transparency gd

我找到了解决问题的方法。请参阅下面的原始帖子,完全在我的解决方案的底部。我犯了一个愚蠢的错误:)


首先,我裁剪图像,然后将其保存到png文件中。在此之后,我也会显示图像 但是,保存的png没有透明度,显示的是透明的。发生了什么事?

$this->resource = imagecreatefrompng($this->url);

imagealphablending($this->resource, false);
imagesavealpha($this->resource, true);

$newResource = imagecreatetruecolor($destWidth, $destHeight);
imagealphablending($newResource, false);
imagesavealpha($newResource, true);

$resample = imagecopyresampled($newResource,$this->resource,0,0,$srcX1,$srcY1,$destWidth,$destHeight,$srcX2-$srcX1, $srcY2-$srcY1);
imagedestroy($this->resource);
$this->resource = $newResource;

// SAVING
imagepng($this->resource, $destination, 100);

// SHOWING
header('Content-type: image/png');
imagepng($this->resource);


我也保存图像的原因是用于缓存。如果脚本在png上执行,则会保存缓存的png 下次请求图像时,将显示png文件,但它已失去透明度。

更奇怪的是:

  • 当我将缓存的png图像保存为(在Firefox中)时,它会突然将其保存为jpg,即使扩展名为png。
  • 使用chrome下载缓存的png并在Photoshop中打开它 给出错误:"file-format module cannot parse the file"

一旦我尝试用GD库显示保存的PNG,它就会给我一个错误。


我发现了问题所在。这是一个愚蠢的错误。我上面提供的脚本是从一个类中删除并作为顺序代码放置,而实际上这并不是完全发生的。保存图像功能:

function saveImage($destination,$quality = 90)
{
    $this->loadResource();
    switch($extension){
        default:
        case 'JPG': 
        case 'jpg': 
            imagejpeg($this->resource, $destination, $quality);
            break;
        case 'gif': 
            imagegif($this->resource, $destination);
            break;
        case 'png': 
            imagepng($this->resource, $destination);
            break;
        case 'gd2': 
            imagegd2($this->resource, $destination);
            break;
    }
}

然而...... $ extension不存在。我通过添加:

来修复它
$extension = $this->getExtension($destination);

0 个答案:

没有答案