Files
ctms-yii/dacms-api/controllers/ImageController.php
T
2025-07-13 19:37:38 +08:00

288 lines
12 KiB
PHP
Executable File

<?php
namespace frontend\controllers;
use Yii;
use yii\web\IdentityInterface;
use yii\helpers\Url;
// use yii\imagine\Image;
class ImageController extends \yii\web\Controller
{
public $enableCsrfValidation = false;//取消对POST数据的csrf令牌验证
public function actionIndex()
{
global $_GPC;
global $_HI;
global $_FM;
$_HI['action'] = 'index';
//本方法采用GD库支持
//创建图片
$height = isset($_HI['post']['h']) ? abs($_HI['post']['h']) :(isset($_HI['get']['h']) ? abs($_HI['get']['h']) :0);
$height = !$height ? 300 : $height;
$width = isset($_HI['post']['w']) ? abs($_HI['post']['w']) :(isset($_HI['get']['w']) ? abs($_HI['get']['w']) :0);
$width = !$width ? 300 : $width;
$im = imagecreatetruecolor($width,$height) or die("Cannot Initialize new GD image stream"); //参数为宽度和高度
// $im=ImageCreateFromJpg("https://public.hiluker.com/vcms/nopic.jpg"); //使用背景图片创建
$bc = isset($_HI['post']['bc']) ? ltrim($_HI['post']['bc']) :(isset($_HI['get']['bc']) ? ltrim($_HI['get']['bc']) :'');
$bc = !$bc ? 'AFAFAF' : $bc;
$fc = isset($_HI['post']['fc']) ? ltrim($_HI['post']['fc']) :(isset($_HI['get']['fc']) ? ltrim($_HI['get']['fc']) :'');
$fc = !$fc ? '333333' : $fc;
//添加颜色
$bc = $this->Hex2RGB('#'.$bc);
$fc = $this->Hex2RGB('#'.$fc);
$text_color = imagecolorallocate($im,$fc['r'],$fc['g'],$fc['b']);
$background_color = imagecolorallocate($im,$bc['r'],$bc['g'],$bc['b']);
$default_color = imagecolorallocate($im,5,5,5);
//绘制矩形图片
imagefilledrectangle($im , 0, 0, $width-1 , $height-1 , $background_color); //填充
// imagefilledrectangle($im , 0, 0, $width-1 , $height-1 , $default_color); //填充
// imagerectangle($im , 0, 0, $width-1 , $height-1, $text_color); //边框
//添加文字
$text = isset($_HI['post']['text']) ? trim($_HI['post']['text']) :(isset($_HI['get']['text']) ? trim($_HI['get']['text']) :'');
$text = !($text) ? '' : html_entity_decode($text);
// imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text );
// 图片源;字体尺寸,文字方向,0从左至右,90从一至下;x、y,首字符起点位置,左下角坐标;color颜色索引。使用负的颜色索引值具有关闭防锯齿的效果;fontfile字体文件
// imagettftext($im,10,0,$width/2,$height/2,$text_color,"/fonts/STHeiti Medium.ttc","☆"); //中心位置标记
$strlen = mb_strlen($text); //字符数(中文算1个字符)
//BUG 180430 只输入一个字时,部分情况报错(中,0,1,`);无字符输入时报错
if($strlen==0){
imagettftext($im,10,0,$width/2-1,$height/2-1,$default_color,"/fonts/STHeiti Medium.ttc","☆"); //中心位置标记
}else{
//文字方向
$fd = isset($_HI['post']['fd']) ? intval($_HI['post']['fd']) :(isset($_HI['get']['fd']) ? intval($_HI['get']['fd']) : -1);
if($fd==-1){
if($width<$height){
$fd = 270;
}else{
$fd = 0;
}
}
$dstyle=1; //文本框长度以矩形长为限
// $dstyle=2; //文本框长度以矩形宽为限
if($dstyle==1){
$long = max($width,$height); //长
$short = min($width,$height); //短
$fd = ($width<$height) ? 270 : $fd;
}else{
$long = $width;
$short = $height; //短
}
//设置文字大小及位置、方向等
$size_l = round($long/$strlen,2)-0.01;
$size_l = intval($long/$strlen);
$size_s = round($short/3,2)-0.01;
$size_s = intval($short/3);
$size = min($size_l,$size_s); //每个字的框宽限制
$f_w = imagefontwidth(6);
$f_h = imagefontheight(6);
$fontsize = intval(($size-$f_w)/1.2); //字体大小
$text_w = $f_w;
if($strlen>1){
for($i=0;$i<$strlen;$i++){
$t = mb_substr($text, $i, 1, 'utf-8');
$len = strlen($t);
if($len==3){
$text_w += $fontsize+$f_w;
}elseif($len==2){
$text_w += $fontsize*2/3;
}elseif($len==1){
$text_w += $fontsize*2/3;
}
}
$text_w = $text_w-$f_w;
}else{
$text_w = $fontsize;
}
$p_l = $long/2 -$text_w/2;
$p_l = intval($p_l);
$p_s = $short/2+$fontsize/2; //字符串底部-y轴高度
$p_s = intval($p_s);
if($fd==90){
//90度时,右下角位置
$x = $p_s-$f_h;
$y = $p_l+$text_w;
}elseif($fd==270){
//270度时,左上角位置
$x = $short/2-$fontsize/2;
$y = $p_l+$f_w;
}else{
//0度时,左下角位置
$x = ($strlen==1) ? $p_l-$f_w : $p_l-$fontsize/2+2*$f_w;
$y = $p_s-$f_h;
}
// var_dump('文本:'.$text);var_dump('字数:'.$strlen);var_dump('字框宽度:'.$size);var_dump('字体大小:'.$fontsize);var_dump('字体宽度:'.$f_w);var_dump('字体高度:'.$f_h);var_dump('文本框总宽度:'.$text_w);var_dump('字符X轴位置:'.$x);var_dump('字符Y轴位置:'.$y);var_dump('文字方向:'.$fd);die();
imagettftext($im,$fontsize,$fd,$x+1,$y+1,$default_color,"/fonts/Arial Unicode.ttf",$text);
imagettftext($im,$fontsize,$fd,$x,$y,$text_color,"/fonts/Arial Unicode.ttf",$text);
}
//生成图片
ob_clean();
// header("Content-type:image/jpeg;");
// imagejpeg($im,null,100);
header("Content-type:image/png;");
imagepng($im);
//在根目录下生成图片文件
// imagejpeg($im,"temp2.jpg",100);
// imagepng($im,"temp2.png");
//释放内存
imagedestroy($im);
}
/**
* RGB转 十六进制
* @param $rgb RGB颜色的字符串 如:rgb(255,255,255);
* @return string 十六进制颜色值 如:#FFFFFF
*/
function RGB2Hex($rgb){
$regexp = "/^rgb\(([0-9]{0,3})\,\s*([0-9]{0,3})\,\s*([0-9]{0,3})\)/";
$re = preg_match($regexp, $rgb, $match);
$re = array_shift($match);
$hexColor = "#";
$hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
for ($i = 0; $i < 3; $i++) {
$r = null;
$c = $match[$i];
$hexAr = array();
while ($c > 16) {
$r = $c % 16;
$c = ($c / 16) >> 0;
array_push($hexAr, $hex[$r]);
}
array_push($hexAr, $hex[$c]);
$ret = array_reverse($hexAr);
$item = implode('', $ret);
$item = str_pad($item, 2, '0', STR_PAD_LEFT);
$hexColor .= $item;
}
return $hexColor;
}
/**
* 十六进制 转 RGB
*/
function Hex2RGB($hexColor) {
$color = str_replace('#', '', $hexColor);
if (strlen($color) > 3) {
$rgb = array(
'r' => hexdec(substr($color, 0, 2)),
'g' => hexdec(substr($color, 2, 2)),
'b' => hexdec(substr($color, 4, 2))
);
} else {
$color = $hexColor;
$r = substr($color, 0, 1) . substr($color, 0, 1);
$g = substr($color, 1, 1) . substr($color, 1, 1);
$b = substr($color, 2, 1) . substr($color, 2, 1);
$rgb = array(
'r' => hexdec($r),
'g' => hexdec($g),
'b' => hexdec($b)
);
}
return $rgb;
}
/**
* 生成图片
* @param array 参数,包括图片和文字
* @param string $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
* @return [type] [description]
*/
function createPoster($config=array(),$filename=""){
//如果要看报什么错,可以先注释调这个header
if(empty($filename)) header("content-type: image/png");
$imageDefault = array(
'left'=>0,
'top'=>0,
'right'=>0,
'bottom'=>0,
'width'=>100,
'height'=>100,
'opacity'=>100
);
$textDefault = array(
'text'=>'',
'left'=>0,
'top'=>0,
'fontSize'=>32, //字号
'fontColor'=>'255,255,255', //字体颜色
'angle'=>0,
);
$background = $config['background'];//海报最底层得背景
//背景方法
$backgroundInfo = getimagesize($background);
$backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
$background = $backgroundFun($background);
$backgroundWidth = imagesx($background); //背景宽度
$backgroundHeight = imagesy($background); //背景高度
$imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
$color = imagecolorallocate($imageRes, 0, 0, 0);
imagefill($imageRes, 0, 0, $color);
// imageColorTransparent($imageRes, $color); //颜色透明
imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
//处理了图片
if(!empty($config['image'])){
foreach ($config['image'] as $key => $val) {
$val = array_merge($imageDefault,$val);
$info = getimagesize($val['url']);
$function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
if($val['stream']){ //如果传的是字符串图像流
$info = getimagesizefromstring($val['url']);
$function = 'imagecreatefromstring';
}
$res = $function($val['url']);
$resWidth = $info[0];
$resHeight = $info[1];
//建立画板 ,缩放图片至指定尺寸
$canvas=imagecreatetruecolor($val['width'], $val['height']);
imagefill($canvas, 0, 0, $color);
//关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
$val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
$val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
//放置图像
imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度
}
}
//处理文字
if(!empty($config['text'])){
foreach ($config['text'] as $key => $val) {
$val = array_merge($textDefault,$val);
list($R,$G,$B) = explode(',', $val['fontColor']);
$fontColor = imagecolorallocate($imageRes, $R, $G, $B);
$val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
$val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
}
}
//生成图片
if(!empty($filename)){
$res = imagejpeg ($imageRes,$filename,90); //保存到本地
imagedestroy($imageRes);
if(!$res) return false;
return $filename;
}else{
imagejpeg ($imageRes); //在浏览器上显示
imagedestroy($imageRes);
}
}
}