上传透明的PNG图像有问题吗?

Posted

技术标签:

【中文标题】上传透明的PNG图像有问题吗?【英文标题】:Issue uploading PNG images with transparency? 【发布时间】:2014-03-20 16:01:41 【问题描述】:

我在上传具有透明度的 PNG 图像时遇到了一些问题。

我在数据库中上传、裁剪和插入图像,当我尝试在网站中显示它们时,它们会变成黑色。它只发生在 PNG 图像上,对于 JPG、JPEG 和 GIF,它工作得很好。

有人可以帮我吗?

提前致谢!

Example

这是我的代码:

公共函数 create_square_image($original_file, $destination_file=NULL, $square_size = 100)

    // get width and height of original image
    $imagedata = getimagesize($original_file);
    $original_width = $imagedata[0];    
    $original_height = $imagedata[1];

    if($original_width > $original_height)
        $new_height = $square_size;
        $new_width = $new_height*($original_width/$original_height);
    
    if($original_height > $original_width)
        $new_width = $square_size;
        $new_height = $new_width*($original_height/$original_width);
    
    if($original_height == $original_width)
        $new_width = $square_size;
        $new_height = $square_size;
    

    $new_width = round($new_width);
    $new_height = round($new_height);

    // load the image
    if(substr_count(strtolower($original_file), ".jpg") or substr_count(strtolower($original_file), ".jpeg"))
        $original_image = imagecreatefromjpeg($original_file);
    
    if(substr_count(strtolower($original_file), ".gif"))
        $original_image = imagecreatefromgif($original_file);
    
    if(substr_count(strtolower($original_file), ".png"))


                    $original_image = imagecreatefrompng($original_file);       
    

    $smaller_image = imagecreatetruecolor($new_width, $new_height);
    $square_image = imagecreatetruecolor($square_size, $square_size);

    imagecopyresampled($smaller_image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);

    if($new_width>$new_height)
        $difference = $new_width-$new_height;
        $half_difference =  round($difference/2);
        imagecopyresampled($square_image, $smaller_image, 0-$half_difference+1, 0, 0, 0, $square_size+$difference, $square_size, $new_width, $new_height);
    
    if($new_height>$new_width)
        $difference = $new_height-$new_width;
        $half_difference =  round($difference/2);
        imagecopyresampled($square_image, $smaller_image, 0, 0-$half_difference+1, 0, 0, $square_size, $square_size+$difference, $new_width, $new_height);
    
    if($new_height == $new_width)
        imagecopyresampled($square_image, $smaller_image, 0, 0, 0, 0, $square_size, $square_size, $new_width, $new_height);
    


    // if no destination file was given then display a png      
    if(!$destination_file)
        imagepng($square_image,NULL,9);
    

    // save the smaller image FILE if destination file given
    if(substr_count(strtolower($destination_file), ".jpg"))
        imagejpeg($square_image,$destination_file,100);
    
    if(substr_count(strtolower($destination_file), ".gif"))
        imagegif($square_image,$destination_file);
    
    if(substr_count(strtolower($destination_file), ".png"))
        imagepng($square_image,$destination_file,9);
    

    imagedestroy($original_image);
    imagedestroy($smaller_image);
    imagedestroy($square_image);


【问题讨论】:

图像是全黑的还是只有应该透明的部分是黑色的? 这些图像完全是黑色的,但它只是发生在 PNG 图像上,当我上传 JPEG 和 JPG 图像时很好。 【参考方案1】:

您需要使用imagesavealpha() 以便在保存时保留 Alpha 通道。

【讨论】:

以上是关于上传透明的PNG图像有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

png 透明图像元数据带有白色背景

DotNetNuke 使用具有透明度的 PNG 图像

回形针 - 将 SVG 转换为 PNG 时保持透明度

使用 PHP GD 库合并两个 PNG 图像

如何使用 PIL 将透明 png 图像与另一个图像合并

如何使用 PIL 将透明 png 图像与另一个图像合并