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 相关文章推荐
ip签名探针
Oct 09 PHP
聊天室php&amp;mysql(六)
Oct 09 PHP
php empty函数 使用说明
Aug 10 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
php实现加减法验证码代码
Feb 14 PHP
php常用hash加密函数
Nov 22 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
php操作access数据库的方法详解
Feb 22 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 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
深入array multisort排序原理的详解
2013/06/18 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
jquery、js操作checkbox全选反选
2014/03/12 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
python写的一个文本编辑器
2014/01/23 Python
Python读取mp3中ID3信息的方法
2015/03/05 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
python3 enum模块的应用实例详解
2019/08/12 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
考试作弊被抓检讨书
2014/01/10 职场文书
教师节活动总结
2014/08/29 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
作文评语集锦
2014/12/25 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android