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 相关文章推荐
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
php中使用$_REQUEST需要注意的一个问题
May 02 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
php建立Ftp连接的方法
Mar 07 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
php日期操作技巧小结
Jun 25 PHP
thinkphp分页实现效果
Oct 13 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
php实现 master-worker 守护多进程模式的实例代码
Jul 20 PHP
php swoft框架实例用法
Dec 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
js 自定义的联动下拉框
2010/02/07 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Python中Unittest框架的具体使用
2019/08/27 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
Delphi软件工程师试题
2013/01/29 面试题
科研先进个人典型材料
2014/01/31 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
加薪通知
2015/04/25 职场文书
演讲开场白台词大全
2015/05/29 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS
教你使用pyinstaller打包Python教程
2021/05/27 Python
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记