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 相关文章推荐
php获取通过http协议post提交过来xml数据及解析xml
Dec 16 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
使用php语句将数据库*.sql文件导入数据库
May 05 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
php中异常处理方法小结
Jan 09 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
php常用数组函数实例小结
Dec 29 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 PHP
php 将json格式数据转换成数组的方法
Aug 21 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
php 使用post,get的一种简洁方式
2010/04/25 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
深入理解ES6之数据解构的用法
2018/01/13 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
python自动安装pip
2014/04/24 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
python求pi的方法
2014/10/08 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python安装whl文件过程图解
2020/02/18 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
Unix如何添加新的用户
2014/08/20 面试题
理想点亮人生演讲稿
2014/05/21 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
工作失误检讨书范文
2015/01/26 职场文书
单身证明格式样本
2015/06/15 职场文书
员工安全责任协议书
2016/03/22 职场文书