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 相关文章推荐
3
Oct 09 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
PHP基础知识回顾
Aug 16 PHP
PHP常用编译参数中文说明
Sep 27 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
apache中为php 设置虚拟目录
Dec 17 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
js 单引号 传递方法
2009/06/22 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Vue计算属性的使用
2017/08/04 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
利用python画一颗心的方法示例
2017/01/31 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
python 读取txt中每行数据,并且保存到excel中的实例
2018/04/29 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
Linux如何压缩可执行文件
2013/10/21 面试题
创先争优演讲稿
2014/09/15 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
同意迁入证明模板
2014/10/26 职场文书
2015教师年度考核评语
2015/03/25 职场文书
React更新渲染原理深入分析
2022/12/24 Javascript