请教一下如何修改一个png图片文件的透明度

overcast 2007-12-02 08:07:32
用php修改一个png图片文件的透明度,比如改为原来的80%透明,并写入到另一个文件中
谢谢
...全文
3249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
0x540x46 2008-07-25
  • 打赏
  • 举报
回复
一年前的帖子,我回答一下吧呵呵,在保存之前imagesavealpha就可以了,具体在手册中查imagesavealpha
overcast 2007-12-11
  • 打赏
  • 举报
回复
算了,分都给你了
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
还有一种方法,扫描取色,然后再取得各个颜色透明值,拼装就行.很容易实现,但效率不高.
overcast 2007-12-02
  • 打赏
  • 举报
回复
imagecopymerge这个函数好像对png图片支持不是很好
我用这个函数将一个Png图片覆盖到另外一个图片的时候,本来png图片透明的部分变成黑色了
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
看来像个Bug,我去搜了下.都是背景设为白色了之.
我刚还试了下读取透明png与其合并也会出现黑色背景的现象.
Image magick Functions 能可以处理.我去看看……
koc104 2007-12-02
  • 打赏
  • 举报
回复
www.KingOfCoder.com 纯编程文章网
SysTem128 2007-12-02
  • 打赏
  • 举报
回复

<?php
$src = imagecreatefrompng("Logo.png"); # load 图片
$width = imagesx($src);
$height = imagesy($src);
$dst = imagecreate($width,$height);
imagecolorallocatealpha ($dst,255,255,255,127);
imagecopymerge($dst,$src,0,0,0,0,$width,$height,20);
imagepng($dst);
?>

按手册来看,所有的施行都是没错的.
但是:

<?php
$src = imagecreatefrompng("Logo.png"); # load 图片
$width = imagesx($src);
$height = imagesy($src);
$dst = imagecreate($width,$height);
imagecolorallocatealpha($dst,255,0,0,102); # 这里设背景色为102透明度(共127)
imagecopymerge($dst,$src,0,0,0,0,$width,$height,20); #这条语句会让上面那条失效.
imagepng($dst);
?>


overcast 2007-12-02
  • 打赏
  • 举报
回复
你仔细看一下我的代码
$src = imagecreatefrompng("a.png"); # load 图片
$width = imagesx($src);
$height = imagesy($src);
$dst = imagecreate($width, $height); #创建一个新图片
$bgcolor = imagecolorallocate($dst,0,0,0);
imagecolortransparent($dst,$bgcolor); #抹去背景色
#到这里为止是生成一张透明的图片,如果没有下面的一行而直接保存的话是一张完全透明的图片
#不是生成黑色背景图片
imagecopymerge($dst,$src,0,0,0,0,$width,$height,80); #合并图片
imagepng($dst, "b.png"); #写入文件

另外,png图片本来有一部分是透明的,不需要镂空的,而且镂空的效果和png图片的透明效果不是一样的
而且我如果把imagecopymerge改为imagecopy的话是没有问题的,相当于复制了一张图片
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
你是将一张黑色的图片和前景图片合并了.背景当然是黑色了.
imagecolorallocate 是用来消除第二张图片中某一颜色的,相当于镂空,然后面的图像能够被看到.
是为了实现水印的特殊效果才弄得.
overcast 2007-12-02
  • 打赏
  • 举报
回复
这句话的意思是抹去黑色的背景
你自己可以试一下阿
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
不是不行,而是你没写对.

imagecolorallocate($dst,0,0,0);# 你自己设置的背景色为黑色呀.
overcast 2007-12-02
  • 打赏
  • 举报
回复
这个好像不行
这是我参照你的代码写的

$src = imagecreatefrompng("a.png"); # load 图片
$width = imagesx($src);
$height = imagesy($src);
$dst = imagecreate($width, $height); #创建一个新图片
$bgcolor = imagecolorallocate($dst,0,0,0);
imagecolortransparent($dst,$bgcolor); #抹去背景色
imagecopymerge($dst,$src,0,0,0,0,$width,$height,80); #合并图片
imagepng($dst, "b.png"); #写入文件

结果背景色是黑色的,郁闷
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
给你做以下注释.

<?php
header("Content-type: image/png"); # 设置输出文件头
$filename='source.jpg'; # 设置源文件地址
$sourceImg=imagecreatefromjpeg($filename); # 读取源图像
$waterImg=imagecreatefrompng('Logo.png'); # 读取水印标志
$bg_color = imagecolorat($waterImg,1,1); # 取出标志中需要设为透明的颜色
imagecolortransparent($waterImg,$bg_color); # 设置标志中需要透明的颜色
$sourceX = imagesx($sourceImg); # 取得源图像宽度
$sourceY = imagesy($sourceImg); # 取得源图像高度
$waterX = imagesx($waterImg);# 取得标志像宽度
$waterY = imagesy($waterImg);# 取得标志像高度
$x = ($sourceX-$waterX)/2;
$y = ($sourceY-$waterY)/2; #计算中心位置
imagecopymerge($sourceImg,$waterImg,$x,$y,0,0,$waterX,$waterY,50); #合并图像 合并度设置为50 .100为完全合并.相当于把第二个参数里的图像透明到原来的50/100然后贴到第一个参数的图像里
imagepng($sourceImg);#输出图像
?>
SysTem128 2007-12-02
  • 打赏
  • 举报
回复
这是一个生成水印的例子.
<?php
header("Content-type: image/png");
$filename='source.jpg';
$sourceImg=imagecreatefromjpeg($filename);
$waterImg=imagecreatefrompng('Logo.png');
$bg_color = imagecolorat($waterImg,1,1);
imagecolortransparent($waterImg,$bg_color); #图片内某颜色的透明
$sourceX = imagesx($sourceImg);
$sourceY = imagesy($sourceImg);
$waterX = imagesx($waterImg);
$waterY = imagesy($waterImg);
$x = ($sourceX-$waterX)/2;
$y = ($sourceY-$waterY)/2;
imagecopymerge($sourceImg,$waterImg,$x,$y,0,0,$waterX,$waterY,50); #最后一个参数是合并度也就是后面那张图片的透明度.
imagepng($sourceImg);
?>

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧