您的位置:首页 > 编程语言 > PHP开发

php 处理透明背景的图片时的问题

2013-07-31 16:52 417 查看
PHP图象处理之透明背景的gif和png图片的一些问题

1,直接读取有透明背景的PNG格式文件,然后直接输出,背景变成了黑色,gif则没有这种情况。

解决方法:使用 imagesavealpha ($image,true),此函数是针对png格式的.

1
<?php
2
$im
=imagecreatefrompng(
"demo_1.png"
);
3
imagesavealpha(
$im
,
true);
//设置标记以在保存
PNG 图像时保存完整的 alpha 通道信息。
4
header(
'Content-type:
image/png'
);
5
imagepng(
$im
);
6
imagedestroy(
$im
);
7
?>
注意一点:不是所有的浏览器都支持 alpha 通道,如果在你的浏览器上碰到问题,试着用兼容 alpha 通道的浏览器(例如最新版的 Mozilla)重新加载脚本。

经测试,在IE中显示效果不理想(但图片仍然是透明的,保存下来看下就知道),背景变成了灰色.

2,在处理(比如缩小,剪切)有透明背景的gif和png图片然后输出时,图片透明部分变成了黑色。

示例代码如下:

01
<?php
02
$size
=
300;
03
$image
=imagecreatetruecolor(
$size
,
$size
);
//创建图片
04
$back
=imagecolorallocatealpha(
$image
,
255,255,255,127);
//加透明颜色,其实好象没什么效果。-_-!
05
06
//读取图片
07
$im
=imagecreatefrompng(
"demo_1.png"
);
08
imagecopyresampled(
$image
,
$im
,10,20,0,0,128,128,128,128);
//合拼图片
09
header(
'Content-type:
image/png'
);
10
imagepng(
$image
);
11
imagedestroy(
$image
);
12
?>
效果是图片背景变成了黑色。

解决办法:使用imagecreate()而不是用imagecreatetruecolor()创建图片。

因为imagecreatetruecolor()返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的黑色图像,

看下帮助手册就知道了。

但这种方法仍然有bug,用于png时,png有部分颜色失去,变成了透明。

解决办法:未知,有知道的告诉我一声,在下先谢谢了。

3.php生产透明背景图片

1
<?php
2
$wite
=
ImageColorAllocate(
$ni
,255,255,255);
//填充的背景色你可以重新指定,我用的是白色
3
imagefilledrectangle(
$ni
,
0,0,
$dstW
,
$dstH
,
$wite
);
4
ImageColorTransparent(
$ni
,
$wite
);
5
?>
不过现在的方法还不是太理想。

2的bug解决办法

01
<?php
02
//创建透明画布
03
$im_out
=imagecreatetruecolor(
$imgcreat_x
,
$imgcreat_y
);
04
imagealphablending(
$im_out
,
true);
05
imagesavealpha(
$im_out
,
true);
06
$trans_colour
=
imagecolorallocatealpha(
$im_out
,
0,0,0,127);
07
imagefill(
$im_out
,
0,0,
$trans_colour
);
08
ImageCopyResized(
$im_out
,
$im
,
0,0,0,0,
$img_x
,
$img_y
,
$img
[0],
$img
[1]);
09
imagepng(
$im_out
);
10
?>
以下是处理透明的3个必须了解的函数

imagealphablending

此函数,开启或关闭一个真彩色图像资源的混色模式。开启与关闭混合模式有什么区别呢?如果不涉及透明度的问题,两个模式没什么区别,但是如果是在一张画布上画一条透明颜色的线,不同的混合模式将出现不同的效果,如果混合模式开启,则透明线的颜色会与原背景中的颜色叠加,计算出新的颜色,显示出来,如果混合模式关闭,则透明线的颜色直接覆盖到画布中对应位置的颜色值。

简单来说,开启混合模式,颜色叠加,关闭混合模式,颜色覆盖。

imagecolorallocatealpha

类似于拾色器的功能,就是生成一个颜色, 的行为和 imagecolorallocate 相同,但多了一个额外的透明度参数 alpha,其值从 0 到 127。0 表示完全不透明,127 表示完全透明。

imagesavealpha

设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息,如果你想保存一个透明的png图标,这个函数是必要的。

给个生成300×300完全透明PNG的例子,

1
<?PHP
2
$block
=imagecreatetruecolor(300,300);
//建立一个画布
3
$c
=imagecolorallocatealpha(
$block
,
0 ,0 ,0 ,127);
//拾取一个完全透明的颜色
4
imagealphablending(
$block
,false);
//关闭混合模式,以便透明颜色能覆盖原画布
5
imagefill(
$block
,
0 ,0,
$c
);
//填充
6
imagesavealpha(
$block
,true);
//设置保存PNG时保留透明通道信息
7
imagepng(
$block
,
'e.png'
);
//生成图片
8
?>
另一种建立透明PNG的方法 , 使用
imagecolortransparent设置图片的透明色属性,也就是把图片上的某个颜色设置成透明色。


1
<?PHP
2
$block
=
imagecreatetruecolor(300 ,300);
//建立一个真彩色画布
3
$white
=
imagecolorallocate(
$block
,
255 ,255 ,255);
//拾取白色
4
imagefill(
$block
,
0 ,0,
$white
);
//把画布染成白色
5
imagecolortransparent(
$block
,
$white
);
//把图片中白色设置为透明色
6
//imagesavealpha($block
,false);
7
imagepng(
$block
,
'e.png'
);
//生成图片
8
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: