菜单

澳门太阳娱乐手机登录:PHP实现接收二进制流转换成图片的方法_php技巧_脚本之家

2020年2月4日 - 澳门太阳娱乐手机登录

本文实例讲述了PHP使用imagick扩展实现合并图像的方法。分享给大家供大家参考,具体如下:

本文实例讲述了PHP实现接收二进制流转换成图片的方法。分享给大家供大家参考,具体如下:

女朋友做外贸的,最近需要做个产品册,要求是每张A4纸上有20个图片,我心想小case吧,哥们会点ps呢。可是当她把图片发给俺,俺一看差点吓屎,近10000张图片,这要ps必定吐血身亡。。。

这里实现php 接收二进制流转换成图片,所使用的图片类imageUpload.php如下:

澳门太阳娱乐手机登录,还好俺还会点php,好吧,写个小程序来完成拼图。因为图片都是按编号排列的,要求给每个图片都加上编号,于是我的思路是:1.先把所有图片缩放到统一尺寸
2.把每张图片和编号组合到一张图
3.把每20张图再组合到一张图。图片处理用到了ImageMagick和php的imagick扩展。下面上代码,有详细注释:

error_handler ; //设置保存图片名称,若未设置,则随机产生一个唯一文件名 $this->save_name = $save_name ? $save_name : md5 , uniqid ; //设置保存图片路径,若未设置,则使用年/月/日格式进行目录存储 $this->save_dir = $save_dir ? self::ROOT_PATH .$save_dir : self::ROOT_PATH .date ; //创建文件夹 @$this->create_dir ; //设置目录+图片完整路径 $this->save_fullpath = $this->save_dir . '/' . $this->save_name; } //兼容PHP4 public function image { $this->__construct ; } public function stream2Image() { //二进制数据流 $data = file_get_contents  ? file_get_contents  : gzuncompress ( $GLOBALS ['HTTP_RAW_POST_DATA'] ); //数据流不为空,则进行保存操作 if  { //创建并写入数据流,然后保存文件 if (@$fp = fopen ( $this->save_fullpath, 'w+' )) { fwrite ; fclose ; $baseurl = "http://" . $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . dirname ( $_SERVER ["SCRIPT_NAME"] ) . '/' . $this->save_name; if ( $this->getimageInfo  { echo $baseurl; } else { echo ( self::NOT_CORRECT_TYPE ); } } else { } } else { //没有接收到数据流 echo ( self::NO_STREAM_DATA ); } } /** * 创建文件夹 * @param String $dirName 文件夹路径名 */ public function create_dir($dirName, $recursive = 1,$mode=0777) { ! is_dir  && mkdir ( $dirName,$mode,$recursive ); } /** * 获取图片信息,返回图片的宽、高、类型、大小、图片mine类型 * @param String $imageName 图片名称 */ public function getimageInfo { $imageInfo = getimagesize ; if  { $imageType = strtolower ( substr ( image_type_to_extension , 1 ) ); $imageSize = filesize ; return $info = array ('width' => $imageInfo [0], 'height' => $imageInfo [1], 'type' => $imageType, 'size' => $imageSize, 'mine' => $imageInfo ['mine'] ); } else { //不是合法的图片 return false; } } /*private function error_handler { echo $a, $b; }*/}?>

第一步:

PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用:

// step1: 调整尺寸到 590 x 590$a = ROOT . '/' . 'a';// 扫描目录$dirA = scandir;$im = new Imagick;foreach  {// 跳过目录和缩略图if ($item === '.' || $item === '..' || strstr {continue;}// 读取图片$im->readImage;// 获取图片宽x高$geo = $im->getImageGeometry();if ($geo['width'] === 590 && $geo['height'] === 590) {// 宽高符合,跳过} else {// 调整尺寸到590 x 590im->resizeImage(590, 590, Gmagick::FILTER_UNDEFINED, 1, TRUE);}// 将图片保存到另一目录$im->writeImage(ROOT . '/_a/' . $item);// 释放资源$im->destroy();}

在线图片转换BASE64工具:

第二步:

ICO图标在线生成工具:

// step2: 合并图片和名字// 扫描目录$files = scandir;$k = 0;foreach  {// 跳过目录和缩略图if ($item === '.' || $item === '..' || strstr {continue;}// 文本图片的宽$twidth = 570;// 文本图片的高$theight = 141;// 获取图片名$pathinfo = pathinfo;$filename = $pathinfo['filename'];// 初始化图片对象$text = new Imagick;// 初始化绘制对象$draw = new ImagickDraw;// 设置字体,这里是放到网站的font下的微软雅黑$draw->setFont;// 文字大小$draw->setFontSize;// 文字颜色$draw->setFillColor(new ImagickPixel;// 文字对齐方式$draw->setTextAlignment;// 获取文字信息,主要是长宽,因为要实现在图片居中$a = $text->queryFontMetrics;// 添加文字$draw->annotation(($twidth - $a['textWidth']) / 2, 80, $filename);// 建立图像$text->newImage($twidth, $theight, new ImagickPixel;// 图片格式$text->setImageFormat;// 绘制图片$text->drawImage;// 新建一个空白图片用来做画布$canvas = new Imagick;$canvas->newimage;$canvas->setImageFormat;// 读取图片$pic = new Imagick;$pic->readImage(ROOT . '/_a/' . $item);$pic->scaleimage;// 将图片合并到画布$canvas->compositeImage($pic, Imagick::COMPOSITE_OVER, 50, 50);// 将文字合并到画布$canvas->compositeimage($text, Imagick::COMPOSITE_OVER, 0, 520);// 保存图片到另一目录$canvas->writeimage(ROOT . '/com_a/' . $item);$k++;echo "{$k} files proceeded.n";}

在线Email邮箱图标制作工具:

第三步:

在线图片格式转换工具:

// step3: 合并每20张到一页// 扫描目录$files = scandir;// 给图片分组$i = $j = 0;$group = array();foreach  { if ($item === '.' || $item === '..' || strstr { continue; } $i++; $group[$j][] = $item; if  { $j++; }}$total = count;// 按组拼接图片,A4纸尺寸,4x5的组合方式foreach  { $canvas = new Imagick; $canvas->newimage; $canvas->setimageformat; $i = $j = 0; foreach  { $im = new Imagick(ROOT . '/com_a/' . $item); // 预留了150的左边距 $x = 150 + $i * 570; // 130的顶边距 $y = 130 + $j * 661; $canvas->compositeimage($im, Imagick::COMPOSITE_OVER, $x, $y); // 每4张一行 if  { $i = 0; $j++; } else { $i++; } } $canvas->writeimage(ROOT . '/merge_a/' . $k . '.png'); $c = $k + 1; echo "Group {$c}/{$total} done.n";}

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组操作技巧大全》、《php字符串用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用:

希望本文所述对大家PHP程序设计有所帮助。

在线图片转换BASE64工具:

ICO图标在线生成工具:

在线Email邮箱图标制作工具:

在线图片格式转换工具:

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组操作技巧大全》、《php字符串用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图