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 相关文章推荐
?繁体转换的class
Oct 09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
建站常用13种PHP开源CMS比较
Aug 23 PHP
php中的一些数组排序方法分享
Jul 20 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php通过session防url攻击方法
Dec 10 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
Jan 07 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
PHP在线书签系统分享
Jan 04 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
laravel框架上传图片实现实时预览功能
Oct 14 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中与数组相关的函数
2007/03/22 PHP
php学习笔记 数组的常用函数
2011/06/13 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
2020/07/18 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
python连接mysql调用存储过程示例
2014/03/05 Python
用Python中的wxPython实现最基本的浏览器功能
2015/04/14 Python
Pandas库之DataFrame使用的学习笔记
2019/06/21 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
详解Scrapy Redis入门实战
2020/11/18 Python
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
医院护士的求职信范文
2013/12/26 职场文书
医生见习报告范文
2014/11/03 职场文书
小班下学期个人总结
2015/02/12 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
小学一年级语文教学反思
2016/03/03 职场文书