PHP圖片合成技術
使用場景:商品海報與用戶二維碼合成
話不多說直接上代碼
該方法存在一種思維,以打開某一個圖片在某一個圖片上添加圖片添加文字爲準,文件流由低到高
/**
* @param $data 二維碼包含的文字內容
* @param $filename 保存二維碼輸出的文件名稱,*.png
* @param bool $picPath 二維碼輸出的路徑
* @param bool $logo 二維碼中包含的LOGO圖片路徑
* @param string $bgColor 二維碼背景色
* @param string $color 二維碼點顏色
* @param int $size 二維碼的大小
* @param string $level 二維碼編碼糾錯級別:L、M、Q、H
* @param int $padding 二維碼邊框的間距
* @param bool $saveandprint 是否保存到文件並在瀏覽器直接輸出,true:同時保存和輸出,false:只保存文件
* @return string
*/
function myqrcode($data, $filename, $picPath = false, $logo = false, $bgColor='#ffffff', $color='#000000', $size = 15, $level = 'L', $padding = 2, $saveandprint = true) {
vendor("phpqrcode.phpqrcode"); //引入工具包
// 下面註釋了把二維碼圖片保存到本地的代碼,如果要保存圖片,用$fileName替換第二個參數false
$qrcode = new \QRcode();
$path = $picPath ? $picPath : "./uploads/".date('Ymd'); //圖片輸出路徑
if (!file_exists($path)) {
mkdir($path,0777,true);
}
$logo = !empty($logo) && file_exists($logo) ? $logo : false;
//在二維碼上面添加LOGO
if (empty($logo) || $logo === false) { //不包含LOGO
if ($filename == false) {
$qrcode->png($data, $filename, $level, $size, $padding, $saveandprint, $bgColor, $color); //直接輸出到瀏覽器,不含LOGO
} else {
$filename = $path . '/' . $filename; //合成路徑
$qrcode->png($data, $filename, $level, $size, $padding, $saveandprint, $bgColor, $color); //直接輸出到瀏覽器,不含LOGO
}
} else { //包含LOGO
if ($filename == false) {
//$filename=tempnam('','').'.png';//生成臨時文件
die('參數錯誤');
} else {
//生成二維碼,保存到文件
$filename = $path . '/' . $filename; //合成路徑
}
$qrcode->png($data, $filename, $level, $size, $padding, $saveandprint, $bgColor, $color);
$QR = imagecreatefromstring(file_get_contents($filename));
$logo = imagecreatefromstring(file_get_contents($logo));
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
if ($filename === false) {
Header("Content-type: image/png");
imagepng($QR);
} else {
if ($saveandprint === true) {
imagepng($QR, $filename);
//header("Content-type: image/png"); //輸出到瀏覽器
//imagepng($QR);
} else {
imagepng($QR, $filename);
}
}
}
return $filename;
}
/**
* 將圖片裁剪爲圓形的圖片
* @param string 圖片的Url地址 $url
* @param string 保存的新的url地址 $path
*/
function circularImg($url, $path){
$w = 270; $h=270; // original size
$original_path= $url;
$src = imagecreatefromstring(file_get_contents($original_path));
$newpic = imagecreatetruecolor($w,$h);
imagealphablending($newpic,false);
$transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127);
$r=$w/2;
for($x=0;$x<$w;$x++)
for($y=0;$y<$h;$y++){
$c = imagecolorat($src,$x,$y);
$_x = $x - $w/2;
$_y = $y - $h/2;
if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
imagesetpixel($newpic,$x,$y,$c);
}else{
imagesetpixel($newpic,$x,$y,$transparent);
}
}
imagesavealpha($newpic, true);
imagepng($newpic, $path);
imagedestroy($newpic);
imagedestroy($src);
// unlink($url);
return $path;
}