php+js实现裁剪任意形状图片


Posted in PHP onOctober 31, 2018

最近做到相关的项目,由于项目使用html2canvas,但是不支持css mask属性,故,利用php后台来裁剪。

准备两张图片,一张是镂空PNG图案,一张是任意纯色图片。

便能够在纯色图片上裁剪出镂空的图案为PNG文件。

见下图。

首先两张PNG图片:

php+js实现裁剪任意形状图片php+js实现裁剪任意形状图片

生成图片

php+js实现裁剪任意形状图片

 JS片段:

html2canvas($(".head1pic"), {
     onrendered: function(canvas) { 
     url = canvas.toDataURL("image/png", 1.0);
       sourcePic = "assets/images/demo.png";
       maskPic = "assets/images/jinmao.png";
          cropPicName = "cropDog1";
          // ajax php截图
          $.ajax({
          type: 'post',
           url: 'getpicture',
          data: {
            "sourcePic": sourcePic,
            "maskPic": maskPic,
            "cropPicName": cropPicName
            },
         success: function(data) {
             $(".page2Bg")[0].setAttribute("src", "assets/images/crop/cropDog1.png"); 
            },
         error: function(data) {
              console.log(data)
              }
            });
       }
 });

PHP的片段:

public function actionGetpicture()
  {  
     $request = Yii::$app->request;
    $sourcePic=$request->post('sourcePic');
    $maskPic=$request->post('maskPic'); 
    $cropPicName=$request->post('cropPicName'); 
 
    // $sourcePic="http://bings.local.com/bi_ngs2_2/assets/images/yinpian1/page2Bg4.png";
    // $maskPic="http://bings.local.com/bi_ngs2_2/assets/images/jinmao.png";
    $source = imagecreatefrompng( $sourcePic );
    $mask = imagecreatefrompng( $maskPic); 
    // Apply mask to source
    // imagealphamask( $source, $mask );
    $this->imagealphamask ($source, $mask );
    // Output
    header( "Content-type: image/png"); 
    // 生成截取后的图片并保存在本地
    imagepng( $source,"assets/images/crop/".$cropPicName.".png" );
    //销毁图片内存
    imagedestroy($source);
      
  }
 
  public function imagealphamask( &$picture, $mask ) {
    // Get sizes and set up new picture
    $xSize = imagesx( $picture );
    $ySize = imagesy( $picture );
    $newPicture = imagecreatetruecolor( $xSize, $ySize );
    imagesavealpha( $newPicture, true );
    imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 100, 100, 0, 127 ) );
 
    // Resize mask if necessary
    // if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {
    //   $tempPic = imagecreatetruecolor( $xSize, $ySize );
    //   imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );
    //   imagedestroy( $mask );
    //   $mask = $tempPic;
    // }
 
    // Perform pixel-based alpha map application
    for( $x = 0; $x < $xSize; $x++ ) {
      for( $y = 0; $y < $ySize; $y++ ) {
        $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );
        //small mod to extract alpha, if using a black(transparent) and white
        //mask file instead change the following line back to Jules's original:
        // $alpha = 127 - floor($alpha['black'] / 2);
        //or a white(transparent) and black mask file:
        // $alpha = floor($alpha['black'] / 2);
        $alpha = $alpha['alpha'];
        $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
        //preserve alpha by comparing the two values
        if ($color['alpha'] > $alpha)
          $alpha = $color['alpha'];
        //kill data for fully transparent pixels
        if ($alpha == 127) {
          $color['red'] = 0;
          $color['blue'] = 0;
          $color['green'] = 0;
        }
        imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );
      }
    }
 
    // Copy back to original picture
    imagedestroy( $picture );
    $picture = $newPicture;
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用PHP实现的生成静态HTML速度快类库
Mar 31 PHP
php中iconv函数使用方法
May 24 PHP
php实例分享之mysql数据备份
May 19 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
php文件缓存类用法实例分析
Apr 22 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
PHP isset empty函数相关面试题及解析
Dec 11 PHP
PHP中->和=>的意思
Mar 31 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 #PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
Oct 30 #PHP
swoole_process实现进程池的方法示例
Oct 29 #PHP
PHP大文件分片上传的实现方法
Oct 28 #PHP
PHP array_reduce()函数的应用解析
Oct 28 #PHP
php 中phar包的使用教程详解
Oct 26 #PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
Oct 25 #PHP
You might like
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
PHP 文件上传全攻略
2010/04/28 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
详解python中字典的循环遍历的两种方式
2017/02/07 Python
python下10个简单实例代码
2017/11/15 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
Django REST framework 视图和路由详解
2019/07/19 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
情侣吵架检讨书
2014/02/05 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
服务整改报告
2014/11/06 职场文书
爱心捐款感谢信
2015/01/20 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
学前班教学反思
2016/02/24 职场文书
JavaScript 数组去重详解
2021/09/15 Javascript
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
Golang jwt身份认证
2022/04/20 Golang