首页 > 开发 > PHP > 正文

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

2024-05-04 22:41:56
字体:
来源:转载
供稿:网友

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

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

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

见下图。

首先两张PNG图片:

生成图片

 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;  }             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表