PHP 关于thinkphp5.0使用Imagick

        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,所以这里建议直接保存图片。

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值