以下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
应该是真的,而不是假的.因人而异.
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 );
你为什么这么复杂?以下是我使用的内容,到目前为止它已经完成了我的工作.
$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]);
我相信这应该可以解决问题:
$srcImage = imagecreatefrompng($uploadTempFile); imagealphablending($srcImage, false); imagesavealpha($srcImage, true);
编辑: PHP文档声明中的某些人imagealphablending
应该是真的,而不是假的.因人而异.
一个可能有助于某些人的补充:
在构建图像时可以切换imagealphablending.我需要这个具体案例,我想在透明背景上组合一些半透明的PNG.
首先,将imagealphablending设置为false,并使用透明颜色填充新创建的真彩色图像.如果imagealphablending为真,则不会发生任何事情,因为透明填充将与黑色默认背景合并并导致黑色.
然后将imagealphablending切换为true并将一些PNG图像添加到画布,使一些背景可见(即不填满整个图像).
结果是具有透明背景和几个组合的PNG图像的图像.
我已经制作了一个调整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; }