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 分库分表hash算法
Nov 12 PHP
PHP全概率运算函数(优化版) Webgame开发必备
Jul 04 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
php实现中文转数字
Feb 18 PHP
关于PHP文件的自动运行方法分析
May 13 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
Sep 11 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
PHP array_reduce()函数的应用解析
Oct 28 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使用者状态管理功能的应用
2006/10/09 PHP
透析PHP的配置文件php.ini
2006/10/09 PHP
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP实现合并discuz用户
2015/08/05 PHP
基于PHP制作验证码
2016/10/12 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
javascript中$(function() {});写与不写有哪些区别
2015/08/10 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
python模块之subprocess模块级方法的使用
2019/03/26 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
优秀员工自荐书
2013/12/19 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
医院领导班子整改方案
2014/10/01 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
工作调动申请报告
2015/05/18 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
Python序列化模块JSON与Pickle
2022/06/05 Python