????????PHP输出画布已经是非常常见的功能,通常使用的都是imagecreatetruecolor()来创建画布,但是有和重要的问题无法修改“分辨率” 。
????????在网页中显示72dpi就足够了,但是打印机使用多数是300dpi,所以建议使用imagick代替imagecreatetruecolor()。使用的基本逻辑差不多,只不过imagick是面向对象式的编程,imagecreatetruecolor是面向过程的开发。
????????优势就是imagick可以修改图片的dpi。下面是我输画布的一些代码参考一下:
(1)首先安装imagick的插件给PHP环境(自行查找资料,网上有现成的资料)
(2)thinkphp5.0使用imagecreatetruecolor()输出图像的方式
public function three_page($id)
{
header('content-type:image/jpeg');
$user = $this->user_info();
//查询用户信息和用户的报相关信息
$data = Graduate::get($id);
$major = Course::where("name",$data['major'])->field("id")->find();
$majorCourse = Majorcourse::where("type",$major['id'])->select();
//设置图片尺寸
$width =1587;
$height =2245;
$img =imagecreatetruecolor($width,$height); //创建一个真色彩画布
$color = imagecolorallocate($img,255,255,255); //创建画布颜色
$textcolor = imagecolorallocate($img,0,0,0); //创建文本颜色
imagefill($img,0,0,$color); //填充颜色
//循环输出用户信息到画布
for($i=0;$i<count($majorCourse);$i++) {
$l = mb_strlen($majorCourse[$i]['name'],"utf-8");
$x = 179+((216-($l*24))/2);
$y = 290+$i*43.7-43.7;
// imagestring($img,57,434,1225,$apply_node,$textcolor);
imagettftext($img, 22, 0, 92, $y, $textcolor, ROOT_PATH . "/public/static/admin/fonts/IRNazaninBold.otf", $i+1);
imagettftext($img, 22, 0, $x, $y, $textcolor, ROOT_PATH . "/public/static/admin/fonts/simsun.ttc", $majorCourse[$i]['name']);
imagettftext($img, 22, 0, 491, $y, $textcolor, ROOT_PATH . "/public/static/admin/fonts/simsun.ttc", $majorCourse[$i]['course_time'] != 0 ? $majorCourse[$i]['course_time'] : "");
imagettftext($img, 22, 0, 639, $y, $textcolor, ROOT_PATH . "/public/static/admin/fonts/simsun.ttc", $majorCourse[$i]['name'] == "毕业设计" ? "优" : rand(75,95));
}
imagejpeg($img,null,100); //输出画布
imagedestroy($img); //销毁画布
exit();
}
(3)在Thinkphp5.0中使用imagick完成画布的输出。(有注意点哦,仔细阅读)
function handleImg(){
header("content-type:image/jpeg"); //设置头部信息
$user = $this->user_info(); //判断是否登录 返回用户信息
//查询用户信息和用户的报名信息
$data = Graduate::get(4);
$major = Course::where("name",$data['major'])->field("id")->find();
$majorCourse = Majorcourse::where("type",$major['id'])->select();
$color_transparent = new \ImagickPixel('#ffffff');
//设置画布的尺寸
$width =1587;
$height =2245;
$image = new \Imagick(); //创建画布
$image->newImage($width,$height,$color_transparent,'jpg');//设置画布的信息以及画布的格式
$style = ["font_size"=>150,"fill_color"=>"#000000","font"=>ROOT_PATH."/public/static/admin/fonts/IRNazaninBold.otf"]; //设置文字的属性
$style2 = ["font_size"=>130,"fill_color"=>"#000000","font"=>ROOT_PATH."/public/static/admin/fonts/simsun.ttc"]; //设置第二个文字的属性
$image->resampleImage(300,300,\Imagick::RESOLUTION_PIXELSPERINCH,0); //设置画布的dpi为300
//循环的将数据库查询到的信息输出到画布上
for($i=0;$i<count($majorCourse);$i++) {
$str = $majorCourse[$i]['name'];
$l = mb_strlen($str, "utf-8");
$x = 800 + (1100-$l*130)/2;
$y = 1130 + $i * 192;
$this->add_text($image, $i+1, 410, $y, 1, $style); //序号
$this->add_text($image, $str, $x ,$y, 1, $style2); //课程名称 900
$this->add_text($image, $majorCourse[$i]['course_time'] != 0 ? $majorCourse[$i]['course_time'] : "", 2200 ,$y, 1, $style); //课时
$this->add_text($image, $majorCourse[$i]['name'] == "毕业设计" ? "优" : rand(75,95), 2840 ,$y, 1, $style2); //成绩
}
echo $image; //输出画布信息,当然最好是换成保存图片。
$image->destroy(); //销毁画布
exit;
}
//设置文字
public function add_text(&$imagick, $text, $x = 0, $y = 0, $angle = 0, $style = array()) {
$draw = new \ImagickDraw ();
if (isset ( $style ['font'] ))
$draw->setFont ( $style ['font'] );
if (isset ( $style ['font_size'] ))
$draw->setFontSize ( $style ['font_size'] );
if (isset ( $style ['fill_color'] ))
$draw->setFillColor ( $style ['fill_color'] );
if (isset ( $style ['under_color'] ))
$draw->setTextUnderColor ( $style ['under_color'] );
if (isset ( $style ['font_family'] ))
$draw->setfontfamily( $style ['font_family'] );
if (isset ( $style ['font'] ))
$draw->setfont($style ['font'] );
$draw->settextencoding('UTF-8');
if (strtolower ($imagick->getImageFormat ()) == 'gif') {
foreach ( $imagick as $frame ) {
$frame->annotateImage ( $draw, $x, $y, $angle, $text );
}
} else {
$imagick->annotateImage ( $draw, $x, $y, $angle, $text );
}
}
注意:(1)不能直接new Imagick需要再前面加一个 “\” ,这样thinkphp才不报错
? ? ? ? ? ?(2)如果是直接输出到浏览器上,然后使用浏览器保存图片大家会发下图片的dpi是96dpi,所以这里建议直接保存图片。
?
?
|