本文实例讲述了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
|
<?php
//背景图和原图需要保持宽高要保持一样,这里的示例原图用的是蓝色背景
init();
function init(){
$old = '1.png' ;
$new = '2.png' ;
//创建一个png透明图
$img = imagecreatefrompng( $old );
setpng( $img , $old , $new );
}
function setpng( $imgid , $filename , $savename ){
$bg = 'bg.png' ; //背景图
$new = imagecreatefrompng( $bg ); //创建一个png透明图
list( $width , $height )= getimagesize ( $filename ); //获取长和宽
$white = imagecolorallocate( $imgid ,1,155,215); //选择一个替换颜色。这里是绿色
cleancolor( $imgid , $white );
imagecolortransparent( $imgid , $white ); //把选择的颜色替换成透明
imagecopymerge( $new , $imgid ,0,0,0,0, $width , $height ,100); //合并图片
imagepng( $new , $savename ); //保存图片
imagedestroy( $imgid ); //销毁
imagedestroy( $new );
echo '<img src="' . $savename . '">' ;
}
function cleancolor( $imgid , $color ){
$width = imagesx( $imgid ); //获取宽
$height = imagesy( $imgid ); //获取高
for ( $i =0; $i < $width ; $i ++){
for ( $k =0; $k < $height ; $k ++){
//对比每一个像素
$rgb = imagecolorat( $imgid , $i , $k );
$r = ( $rgb >> 16)&0xff; //取R
$g = ( $rgb >> 8)&0xff; //取G
$b = $rgb &0xff; //取B
$randr = 1.5;
$randg = 1;
$randb =1;
//蓝色RGB大致的位置。替换成绿色
if ( $r <=65* $randr && $g <=225* $randg && $b <=255* $randb && $b * $randb >=100){
//如果能够精确的计算出要保留位置的,这里可以写绝对的数字
if ( $i >= $width /2 && $i <= $width /2 && $k >= $height /2 && $k <= $height /2){
} else {
//改变颜色
imagesetpixel( $imgid , $i , $k , $color );
}
}
}
}
}
|
- $old指的是要处理的图片,指定为png格式
- $new指的是处理后输出的图片名
- $bg指的是背景图
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://segmentfault.com/a/1190000022566355