>  기사  >  php教程  >  PHP 기본 이미지 합성 및 텍스트 생성 이미지

PHP 기본 이미지 합성 및 텍스트 생성 이미지

不言
不言원래의
2018-05-26 13:36:549697검색

이전에 원격 주소에서 사진을 가져와 로컬에 저장할 수 있는 게시물이 있었습니다.
얼마 전에 매우 인기가 있었던 Moments 태그는 아래 세 가지 사용자 정의 기능을 사용하여 합성할 수 있습니다. 시토우. 개선이 필요한 부분이 있으면 직접 메시지를 남겨주세요!

/**
* a.合成图片信息 复制一张图片的矩形区域到另外一张图片的矩形区域
* @param  [type] $bg_image  [目标图]
* @param  [type] $sub_image [被添加图]
* @param  [type] $add_x     [目标图x坐标位置]
* @param  [type] $add_y     [目标图y坐标位置]
* @param  [type] $add_w     [目标图宽度区域]
* @param  [type] $add_h     [目标图高度区域]
* @param  [type] $out_image [输出图路径]
* @return [type]            [description]
*/
function image_copy_image($bg_image,$sub_image,$add_x,$add_y,$add_w,$add_h,$out_image){
if($sub_image){
$bg_image_c = imagecreatefromstring(file_get_contents($bg_image));
$sub_image_c = imagecreatefromstring(file_get_contents($sub_image));
imagecopyresampled($bg_image_c, $sub_image_c, $add_x, $add_y, 0, 0, $add_w, $add_h, imagesx($sub_image_c), imagesy($sub_image_c));
//保存到out_image
imagejpeg($bg_image_c, $out_image, 80);
imagedestroy($sub_image_c);
imagedestroy($bg_image_c);
}

}
/**
* b.生成文字图片并插入广告图中
* @param  [type] $filename    [背景路径]
* @param  [type] $text        [文字内容]
* @param  [type] $font        [文字大小]
* @param  [type] $size        [文字画布的宽]
* @param  [type] $width_f     [文字颜色]
* @param  [type] $red         [红]
* @param  [type] $grn	  [绿]
* @param [type] $blu          [蓝]
*/
function create_text($filename,$text,$font,$size,$width_f,$red,$grn,$blu){
$rot  = 0; // 旋转角度
$width = 0; //宽度
$height = 0; //高度
$offset_x = 0; //x偏移
$offset_y = 0; //y偏移
$bounds = array();
$text = autowrap($size, 0, $font, $text,$width_f); // 自动换行处理
/** [字体大小] [角度] [字体名称] [字符串] [预设宽度] */
// 确定边框高度.
$bounds = ImageTTFBBox($size, $rot, $font, "W");
if ($rot < 0) {
$font_height = abs($bounds[7]-$bounds[1]);
} else if ($rot > 0) {
$font_height = abs($bounds[1]-$bounds[7]);
} else {
$font_height = abs($bounds[7]-$bounds[1]);
}
// 确定边框高度.
$bounds = ImageTTFBBox($size, $rot, $font, $text);
if ($rot < 0) {
$width = abs($bounds[4]-$bounds[0]);
$height = abs($bounds[3]-$bounds[7]);
$offset_y = $font_height;
$offset_x = 0;
} else if ($rot > 0) {
$width = abs($bounds[2]-$bounds[6]);
$height = abs($bounds[1]-$bounds[5]);
$offset_y = abs($bounds[7]-$bounds[5])+$font_height;
$offset_x = abs($bounds[0]-$bounds[6]);
} else {
$width = abs($bounds[4]-$bounds[6]);
$height = abs($bounds[7]-$bounds[1]);
$offset_y = $font_height;
$offset_x = 0;
}
$bg = imagecreatetruecolor($width + 20,$height + 20); // 创建画布
$color=imagecolorallocatealpha($bg , 0 , 0 , 0 ,127);//拾取一个完全透明的颜色
imagealphablending($bg ,false);//关闭混合模式,以便透明颜色能覆盖原画布
imagefill($bg , 0 , 0, $color);//填充
imagesavealpha($bg ,true);//设置保存PNG时保留透明通道信息
$textImg = imagecolorallocate($bg, $red, $grn, $blu); // 创建白色
ImageTTFText($bg, $size, 0, 10, $size + 10, $textImg, $font, $text);
imagepng($bg,$filename);
}
/**
* 文字自动换行
* @param  [type] $fontsize    [字体大小]
* @param  [type] $angle       [角度]
* @param  [type] $fontface    [字体名称]
* @param  [type] $string      [字符串]
* @param  [type] $width       [预设宽度]
*/
function autowrap($fontsize, $angle, $fontface, $string, $width) {
$content = "";
// 将字符串拆分成一个个单字 保存到数组 letter 中
preg_match_all("/./u", $string, $arr);
$letter = $arr[0];
foreach ($letter as $l) {
$teststr = $content." ".$l;
$testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
// 判断拼接后的字符串是否超过预设的宽度
if (($testbox[2] > $width) && ($content !== "")) {
$content .= PHP_EOL;
}
$content .= $l;
}
return $content;
}

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.