PHP图象处理之透明背景的gif和png图片的一些问题
1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况。
<?php $im=imagecreatefrompng("demo_1.png"); imagesavealpha($im, true);//设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息。 header('Content-type: image/png'); imagepng($im); imagedestroy($im); ?>
注意一点:不是所有的浏览器都支持 alpha 通道,如果在你的浏览器上碰到问题,试着用兼容 alpha 通道的浏览器(例如最新版的 Mozilla)重新加载脚本。
2,在处理(比如缩小,剪切)有透明背景的gif和png图片然后输出时,图片透明部分变成了黑色。
<?php $size = 300; $image=imagecreatetruecolor($size, $size);//创建图片 $back =imagecolorallocatealpha($image, 255, 255, 255,127);//加透明颜色,其实好象没什么效果。-_-! //读取图片 $im=imagecreatefrompng("demo_1.png"); imagecopyresampled($image,$im,10,20,0,0,128,128,128,128);//合拼图片 header('Content-type: image/png'); imagepng($image); imagedestroy($image); ?>
效果是图片背景变成了黑色。
3.php生产透明背景图片
<?php $wite = ImageColorAllocate($ni,255,255,255);//填充的背景色你可以重新指定,我用的是白色 imagefilledrectangle($ni, 0, 0, $dstW, $dstH, $wite); ImageColorTransparent($ni, $wite); ?>
不过现在的方法还不是太理想。
2的bug解决办法
<?php //创建透明画布 $im_out =imagecreatetruecolor($imgcreat_x, $imgcreat_y); imagealphablending($im_out, true); imagesavealpha($im_out, true); $trans_colour = imagecolorallocatealpha($im_out, 0, 0, 0, 127); imagefill($im_out, 0, 0, $trans_colour); ImageCopyResized($im_out, $im, 0,0, 0, 0, $img_x, $img_y, $img[0], $img[1]); imagepng($im_out); ?>
以下是处理透明的3个必须了解的函数
imagealphablending
此函数,开启或关闭一个真彩色图像资源的混色模式。开启与关闭混合模式有什么区别呢?如果不涉及透明度的问题,两个模式没什么区别,但是如果是在一张画布上画一条透明颜色的线,不同的混合模式将出现不同的效果,如果混合模式开启,则透明线的颜色会与原背景中的颜色叠加,计算出新的颜色,显示出来,如果混合模式关闭,则透明线的颜色直接覆盖到画布中对应位置的颜色值。
简单来说,开启混合模式,颜色叠加,关闭混合模式,颜色覆盖。
imagecolorallocatealpha
类似于拾色器的功能,就是生成一个颜色, 的行为和 imagecolorallocate
imagesavealpha
设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息,如果你想保存一个透明的png图标,这个函数是必要的。
给个生成300×300完全透明PNG的例子,
<?php $block=imagecreatetruecolor(300,300);//建立一个画布 $c=imagecolorallocatealpha($block , 0 , 0 , 0 ,127);//拾取一个完全透明的颜色 imagealphablending($block ,false);//关闭混合模式,以便透明颜色能覆盖原画布 imagefill($block , 0 , 0, $c);//填充 imagesavealpha($block ,true);//设置保存PNG时保留透明通道信息 imagepng($block ,'e.png');//生成图片 ?>
另一种建立透明PNG的方法 , 使用imagecolortransparent设置图片的透明色属性,也就是把图片上的某个颜色设置成透明色。
<?php $block= imagecreatetruecolor(300 ,300);//建立一个真彩色画布 $white= imagecolorallocate($block , 255 , 255 ,255);//拾取白色 imagefill($block , 0 , 0, $white);//把画布染成白色 imagecolortransparent($block ,$white );//把图片中白色设置为透明色 //imagesavealpha($block , false); imagepng($block ,'e.png');//生成图片 ?>
最新评论