php+js实现裁剪任意形状图片

最近做到相关的项目,由于项目使用html2canvas,但是不支持css mask属性,故,利用php后台来裁剪。

准备两张图片,一张是镂空PNG图案,一张是任意纯色图片。

便能够在纯色图片上裁剪出镂空的图案为PNG文件。

见下图。

首先两张PNG图片:

生成图片

 JS片段:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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的片段:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public function actionGetpicture()
 
     $request = Yii:: $app ->request;
    $sourcePic = $request ->post( 'sourcePic' );
    $maskPic = $request ->post( 'maskPic' );
    $cropPicName = $request ->post( 'cropPicName' );
 
    $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框架之ThinkPHP项目开发CMS内容管理系统
php基础视频教程 20课 附源码课件
最新PHP3小时光速入门视频教程 13课 附源码课件
ThinkPHP5.0+微信小程序商城 构建全栈应用完整版 attach_img  ...2
ThinkPHP3.12免费视频教程 attach_img
【PHP实战】留言本项目实战 attach_img
【php项目实战】php在线商城系统开发教程 attach_img
【php项目实战】博客系统 attach_img
李炎恢基于ThinkPHP+EasyUI的CRM客户关系管理系统 attach_img
李炎恢PHP第四季视频课程(ThinkPHP+jQuery+UI+微博系统) attach_img
李炎恢php第三季(在线商城系统) attach_img
李炎恢php第二季(面向对象项目实战) attach_img
李炎恢php第一季视频教程(php基础+项目) attach_img
新版ThinkPHP视频教程 30课 附源码课件
BroPHP框架与项目实战视频教程 两套
PHP项目实战之美团网开发视频教程 40课 附源码资料
基于HDPHP的防360问答系统项目实战视频教程 28课
零基础系统讲解PHP+MySQL网络编程技术视频课程 41课
PHP网站开发工程师就业指导班 35课 附课件、源码
PHP大型门户网站核心技术之页面静态化 附课件、源码、软件

转载于:https://www.cnblogs.com/janera/p/10016749.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
smartcrop.js 是一款基于JavaScript 图片处理的智能裁剪库。在很多项目开发中,经常会遇见上传图片的场景,它可能是用户照片信息,也可能是商品图片等。然而在网页布局中,为了更好的用户体验,它们往往都需要一些宽度和高度的限制。对于不合适的图片,常常需要为用户提供一种裁剪方式,以此来满足网站更好的用户体验。但是图片默认的裁剪区域往往被显示在一个固定的位置,而这个位置却往往又不是精准的用户裁剪位置。因此今天为大家介绍的这一款开源库,就是为了解决这类问题,并为用户提供更好的用户体验的。 smartcrop.js 支持: common js amd global export / window 首先我们可以使用npm install smartcrop或者bower install smartcrop来下载它。然后像如下方式使用它: 简单示例: SmartCrop.crop(image, { width: 100, height: 100 }, function(result){ console.log(result); // {topCrop: {x: 300, y: 200, height: 200, width: 200}} }); 它会输出一个比较好的最佳图片裁剪位置,如{topCrop: {x: 300, y: 200, height: 200, width: 200}}的数据。 效果欣赏: 更多案例: http://29a.ch/sandbox/2014/smartcrop/examples/testsuite.html:这里拥有超过1000个图片效果的展示(流量用户请谨慎点击,图片众多); http://29a.ch/sandbox/2014/smartcrop/examples/testbed.html:这里允许上传本地的图片,并体验其效果; http://29a.ch/sandbox/2014/smartcrop/examples/slideshow.html:在这里可以尝试用它创建幻灯片。 标签:smartcrop  图片裁剪

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值