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' ); // $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 ; } |