php 处理png图片白色背景色改为透明色的实例代码


Posted in PHP onDecember 10, 2018

先看下面一段代码,php 处理png图片白色背景色改为透明色

function pngMerge($o_pic,$out_pic){
 $begin_r = 255;
 $begin_g = 250;
 $begin_b = 250;
 list($src_w, $src_h) = getimagesize($o_pic);// 获取原图像信息 宽高
 $src_im = imagecreatefrompng($o_pic); //读取png图片
 print_r($src_im);
 imagesavealpha($src_im,true);//这里很重要 意思是不要丢了$src_im图像的透明色
 $src_white = imagecolorallocatealpha($src_im, 255, 255, 255,127); // 创建一副白色透明的画布
 for ($x = 0; $x < $src_w; $x++) {
  for ($y = 0; $y < $src_h; $y++) {
    $rgb = imagecolorat($src_im, $x, $y);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
    if($r==255 && $g==255 && $b == 255){
    imagefill($src_im,$x, $y, $src_white); //填充某个点的颜色
    imagecolortransparent($src_im, $src_white); //将原图颜色替换为透明色
    }
    if (!($r <= $begin_r && $g <= $begin_g && $b <= $begin_b)) {
     imagefill($src_im, $x, $y, $src_white);//替换成白色
     imagecolortransparent($src_im, $src_white); //将原图颜色替换为透明色
    }
  }
 }
 $target_im = imagecreatetruecolor($src_w, $src_h);//新图
 imagealphablending($target_im,false);//这里很重要,意思是不合并颜色,直接用$target_im图像颜色替换,包括透明色;
 imagesavealpha($target_im,true);//这里很重要,意思是不要丢了$target_im图像的透明色;
 $tag_white = imagecolorallocatealpha($target_im, 255, 255, 255,127);//把生成新图的白色改为透明色 存为tag_white
 imagefill($target_im, 0, 0, $tag_white);//在目标新图填充空白色
 imagecolortransparent($target_im, $tag_white);//替换成透明色
 imagecopymerge($target_im, $src_im, 0, 0, 0, 0, $src_w, $src_h, 100);//合并原图和新生成的透明图
 imagepng($target_im,$out_pic);
 return $out_pic;
}
$o_pic = '1.png';
$name = pngMerge($o_pic,'aaaa.png');
print_r($name);

补充:用PHP的GD库把图片的背景替换成透明背景

之前写个功能用PHP把图片的背景弄成透明,之留下文字(黑色的),我也在百度上找,也试过别人的代码。大多数代码的思路都是这样:

生成新的画布,读取源图片每个坐标的颜色,不符合要求的用imagecolortransparent()函数将该颜色替换成透明的。

$o_pic = '1.jpg';
//要处理的色阶起始值
$begin_r = 215;
$begin_g = 215;
$begin_b = 215;
list($src_w,$src_h,$src_type) = getimagesize($o_pic);// 获取原图像信息
$file_ext = get_ext($o_pic);//获取扩展名
$target_im = imagecreatetruecolor($src_w,$src_h);//新图
if($file_ext == 'jpg') //转换JPG 开始
{
  $src_im = ImageCreateFromJPEG($o_pic);
  imagecopymerge($target_im,$src_im,0,0,0,0,$src_w,$src_h,100);
  for($x = 0; $x < $src_w; $x++)
  {
    for($y = 0; $y < $src_h; $y++)
    {
      $rgb = imagecolorat($src_im, $x, $y);
      $r = ($rgb >> 16) & 0xFF;
      $g = ($rgb >> 8) & 0xFF;
      $b = $rgb & 0xFF;
      if($r > $begin_r && $g > $begin_g && $b > $begin_b ){  
        imagecolortransparent($target_im, imagecolorallocate($target_im,$r, $g, $b));        
      }
    }
  }
}

但是用了这个思路,图片的背景一直都不能便透明,改了好多次。
后来发现只有最后一次imagecolortransparent()有效果,前面都都被覆盖了。

把思路改了下,把不要的颜色先统一转换成白色,最后再将白色替换成透明

$begin_r = 98;
$begin_g = 98;
$begin_b = 98;
list($src_w, $src_h) = getimagesize($o_pic);// 获取原图像信息
$src_im = imagecreatefromjpeg($o_pic);
//imagecopymerge($target_im, $src_im, 0, 0, 0, 0, $src_w, $src_h, 100);
//imagecopyresampled($target_im, $src_im, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);
$i = 0;
$src_white = imagecolorallocate($src_im, 255, 255, 255);
for ($x = 0; $x < $src_w; $x++) {
  for ($y = 0; $y < $src_h; $y++) {
   $rgb = imagecolorat($src_im, $x, $y);
   $r = ($rgb >> 16) & 0xFF;
   $g = ($rgb >> 8) & 0xFF;
   $b = $rgb & 0xFF;
   if($r==255 && $g==255 && $b == 255){
     $i ++;
     continue;
   }
   if (!($r <= $begin_r && $g <= $begin_g && $b <= $begin_b)) {
     imagefill($src_im, $x, $y, $src_white);//替换成白色
   }
  }
}
$target_im = imagecreatetruecolor($src_w, $src_h);//新图
$tag_white = imagecolorallocate($target_im, 255, 255, 255);
imagefill($target_im, 0, 0, $tag_white);
imagecolortransparent($target_im, $tag_white);
imagecopymerge($target_im, $src_im, 0, 0, 0, 0, $src_w, $src_h, 100);

总结

以上所述是小编给大家介绍的php 处理png图片白色背景色改为透明色的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
搜索引擎技术核心揭密
Oct 09 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
php分页函数完整实例代码
Sep 22 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
May 12 PHP
php截取视频指定帧为图片
May 16 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP实现的用户注册表单验证功能简单示例
Feb 25 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 #PHP
PHP聊天室简单实现方法详解
Dec 08 #PHP
PHP文件操作实例总结【文件上传、下载、分页】
Dec 08 #PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
Dec 08 #PHP
Laravel框架定时任务2种实现方式示例
Dec 08 #PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 #PHP
thinkPHP框架实现的简单计算器示例
Dec 07 #PHP
You might like
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
UserData用法总结 lanyu出品
2010/07/01 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
js实现随机点名
2021/01/19 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
python自动安装pip
2014/04/24 Python
python中遍历文件的3个方法
2014/09/02 Python
bpython 功能强大的Python shell
2016/02/16 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
医学生毕业自我鉴定
2014/03/26 职场文书
中国梦演讲稿5分钟
2014/08/19 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
人事任命通知
2015/04/20 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript