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 无限极分类
Mar 27 PHP
PHP MemCached高级缓存配置图文教程
Aug 05 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
PHP函数getenv简介和使用实例
May 12 PHP
php 购物车完整实现代码
Jun 05 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
PHP安全上传图片的方法
Mar 21 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
php实现快速对二维数组某一列进行组装的方法小结
Dec 04 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判断两个浮点数是否相等的方法
2015/03/14 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
JavaScript基本对象
2007/01/11 Javascript
JavaScript 中的replace方法说明
2007/04/13 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
javascript实现右下角广告框效果
2017/02/01 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
js实现烟花特效
2020/03/02 Javascript
js实现轮播图特效
2020/05/28 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python关闭windows进程的方法
2015/04/18 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
法人代表任命书范本
2014/06/05 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
秋季运动会开幕词
2015/01/28 职场文书
学校运动会开幕词
2016/03/03 职场文书
学生安全责任协议书
2016/03/22 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电