当前位置:  开发笔记 > 编程语言 > 正文

使用PHP的GDlib imagecopyresampled时,是否可以保留PNG图像透明度?

如何解决《使用PHP的GDlibimagecopyresampled时,是否可以保留PNG图像透明度?》经验,为你挑选了5个好方法。

以下PHP代码段使用GD将浏览器上传的PNG大小调整为128x128.它的效果很好,除了原始图像中的透明区域在我的情况下被替换为纯黑色.

虽然imagesavealpha已经确定,但事情并不完全正确.

保留重采样图像透明度的最佳方法是什么?

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );    
imagesavealpha( $targetImage, true );

$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

Cheekysoft.. 192

imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

为我做了 谢谢ceejayoz.

请注意,目标图像需要Alpha设置,而不是源图像.

编辑:完整替换代码.另见以下答案及其评论.这不能保证在任何方面都是完美的,但在当时确实满足了我的需求.

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile ); 

$targetImage = imagecreatetruecolor( 128, 128 );   
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

FIY,这需要在创建目标图像之后.在这种情况下,它将在imagecreatetruecolor之后. (5认同)

这个答案不仅正确而且有用,它特别有用,因为对于`imagecreatefrompng()`的PHP文档的第一条评论(在撰写本文时)表明`imagealphablending`应该设置为'true`,这显然是错误的.非常感谢. (2认同)

这个解决方案,在我的情况下,只有PNG有一个"常规"透明区域,如周围的透明区域,如果它有一个复杂的区域,如果图像的内部部分具有透明度,它始终失败并放置黑色背景例如,此图像失败:http://www.seomofo.com/downloads/new-google-logo-knockoff.png.任何人都可以试试并确认吗? (2认同)


小智.. 21

你为什么这么复杂?以下是我使用的内容,到目前为止它已经完成了我的工作.

$im = ImageCreateFromPNG($source);
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]);
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0));
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]);


ceejayoz.. 10

我相信这应该可以解决问题:

$srcImage = imagecreatefrompng($uploadTempFile);
imagealphablending($srcImage, false);
imagesavealpha($srcImage, true);

编辑: PHP文档声明中的某些人imagealphablending应该是真的,而不是假的.因人而异.



1> Cheekysoft..:
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

为我做了 谢谢ceejayoz.

请注意,目标图像需要Alpha设置,而不是源图像.

编辑:完整替换代码.另见以下答案及其评论.这不能保证在任何方面都是完美的,但在当时确实满足了我的需求.

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile ); 

$targetImage = imagecreatetruecolor( 128, 128 );   
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );


FIY,这需要在创建目标图像之后.在这种情况下,它将在imagecreatetruecolor之后.
这个答案不仅正确而且有用,它特别有用,因为对于`imagecreatefrompng()`的PHP文档的第一条评论(在撰写本文时)表明`imagealphablending`应该设置为'true`,这显然是错误的.非常感谢.
这个解决方案,在我的情况下,只有PNG有一个"常规"透明区域,如周围的透明区域,如果它有一个复杂的区域,如果图像的内部部分具有透明度,它始终失败并放置黑色背景例如,此图像失败:http://www.seomofo.com/downloads/new-google-logo-knockoff.png.任何人都可以试试并确认吗?

2> 小智..:

你为什么这么复杂?以下是我使用的内容,到目前为止它已经完成了我的工作.

$im = ImageCreateFromPNG($source);
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]);
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0));
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]);



3> ceejayoz..:

我相信这应该可以解决问题:

$srcImage = imagecreatefrompng($uploadTempFile);
imagealphablending($srcImage, false);
imagesavealpha($srcImage, true);

编辑: PHP文档声明中的某些人imagealphablending应该是真的,而不是假的.因人而异.


使用`imagealphablending`或者是真或假我总是得到黑色背景.

4> Jorrit Schip..:

一个可能有助于某些人的补充:

在构建图像时可以切换imagealphablending.我需要这个具体案例,我想在透明背景上组合一些半透明的PNG.

首先,将imagealphablending设置为false,并使用透明颜色填充新创建的真彩色图像.如果imagealphablending为真,则不会发生任何事情,因为透明填充将与黑色默认背景合并并导致黑色.

然后将imagealphablending切换为true并将一些PNG图像添加到画布,使一些背景可见(即不填满整个图像).

结果是具有透明背景和几个组合的PNG图像的图像.



5> 小智..:

我已经制作了一个调整JPEG/GIF/PNG图像大小的功能,copyimageresample而PNG图像仍保持透明度:

$myfile=$_FILES["youimage"];

function ismyimage($myfile) {
    if((($myfile["type"] == "image/gif") || ($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") || ($myfile["type"] == "image/png")) && ($myfile["size"] <= 2097152 /*2mb*/) ) return true; 
    else return false;
}

function upload_file($myfile) {         
    if(ismyimage($myfile)) {
        $information=getimagesize($myfile["tmp_name"]);
        $mywidth=$information[0];
        $myheight=$information[1];

        $newwidth=$mywidth;
        $newheight=$myheight;
        while(($newwidth > 600) || ($newheight > 400 )) {
            $newwidth = $newwidth-ceil($newwidth/100);
            $newheight = $newheight-ceil($newheight/100);
        } 

        $files=$myfile["name"];

        if($myfile["type"] == "image/gif") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromgif($myfile["tmp_name"]);
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagegif($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con){
                return true;
            } else {
                return false;
            }
        } else if(($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") ) {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromjpeg($myfile["tmp_name"]); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagejpeg($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {  
                return true;
            } else {
                return false;
            }
        } else if($myfile["type"] == "image/png") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefrompng($myfile["tmp_name"]);
            imagealphablending($tmp, false);
            imagesavealpha($tmp,true);
            $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
            imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagepng($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {
                return true;
            } else {
                return false;
            }
        }   
    } else
          return false;
}


阅读所有代码以确定为什么透明度在此代码中保留在问题代码中是相当繁重的.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有