php+js實現(xiàn)裁剪任意形狀圖片
更新時間:2018年10月31日 10:06:26 作者:coder_daiwang
這篇文章主要為大家詳細介紹了php+js實現(xiàn)裁剪任意形狀圖片,類似css mask,具有一定的參考價值,感興趣的小伙伴們可以參考一下
最近做到相關(guān)的項目,由于項目使用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" );
//銷毀圖片內(nèi)存
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;
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何在thinkphp中使用windows計劃任務定時執(zhí)行php文件
這篇文章主要介紹了如何在thinkphp中使用windows計劃任務定時執(zhí)行php文件,對定時執(zhí)行感興趣的同學,可以參考下2021-04-04
PHP判斷一個數(shù)組是另一個數(shù)組子集的方法詳解
這篇文章主要介紹了PHP判斷一個數(shù)組是另一個數(shù)組子集的方法,結(jié)合實例形式分析了php循環(huán)遍歷、array_diff及array_intersect函數(shù)等方法實現(xiàn)數(shù)組子集判斷的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
PHP+JS+rsa數(shù)據(jù)加密傳輸實現(xiàn)代碼
PHP+JS+rsa數(shù)據(jù)加密傳輸實現(xiàn)代碼,需要的朋友可以參考下。2011-03-03
php7 list()、session及其他模塊的修改實例分析
這篇文章主要介紹了php7 list()、session及其他模塊的修改,結(jié)合實例形式分析了php7 list()、session及其他模塊的修改相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下2020-05-05

