• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】

    本文实例讲述了PHP实现将几张照片拼接到一起的合成图片功能。分享给大家供大家参考,具体如下:

    ?php
    /**
     * 作品合成程序
     * 针对单面,封面不做特殊处理
     */
    $src_path = $argv[1]; // php该文件,第一个参数是文件夹名(作品集),可相对路径
    $dst_path = '../image/'.$src_path; // 生成文件存放的目标位置
    if (!file_exists($dst_path)){
     mkdir($dst_path);
    }
    // 合成图推荐大小,单页大小建议:1120*1600
    $g_width = 1120;
    $g_height = 1600;
    $g_border = 20; // 边框
    // 模板
    // 图片张数=>array(位置=>array(x,y,width,height))
    $g_models = array(
     1=>array( // 单页总张数
      0=>array( // 位置
       'x' => 0 + $g_border,
       'y' => 0 + $g_border,
       'w' => $g_width - 2*$g_border,
       'h' => $g_height - 2*$g_border,
      ),
     ),
     3=>array(
      0=>array(
       'x' => 0 + $g_border,
       'y' => 0 + $g_border,
       'w' => $g_width - 2*$g_border,
       'h' => ($g_height - 3*$g_border)/2,
      ),
      1=>array(
       'x' => 0 + $g_border,
       'y' => 0 + $g_border + ($g_height - 3*$g_border)/2 + $g_border,
       'w' => ($g_width - 3*$g_border)/2,
       'h' => ($g_height - 3*$g_border)/2,
      ),
      2=>array(
       'x' => 0 + $g_border + ($g_width - 3*$g_border)/2 + $g_border,
       'y' => 0 + $g_border + ($g_height - 3*$g_border)/2 + $g_border,
       'w' => ($g_width - 3*$g_border)/2,
       'h' => ($g_height - 3*$g_border)/2,
      ),
     ),
     4=>array(
      0=>array(
       'x' => 0 + $g_border,
       'y' => 0 + $g_border,
       'w' => ($g_width-3*$g_border)/2,
       'h' => ($g_height-3*$g_border)/2,
      ),
      1=>array(
       'x' => 0 + $g_border + ($g_width-3*$g_border)/2 + $g_border,
       'y' => 0 + $g_border,
       'w' => ($g_width-3*$g_border)/2,
       'h' => ($g_height-3*$g_border)/2,
      ),
      2=>array(
       'x' => 0 + $g_border,
       'y' => 0 + $g_border + ($g_height-3*$g_border)/2 + $g_border,
       'w' => ($g_width-3*$g_border)/2,
       'h' => ($g_height-3*$g_border)/2,
      ),
      3=>array(
       'x' => 0 + $g_border + ($g_width-3*$g_border)/2 + $g_border,
       'y' => 0 + $g_border + ($g_height-3*$g_border)/2 + $g_border,
       'w' => ($g_width-3*$g_border)/2,
       'h' => ($g_height-3*$g_border)/2,
      ),
     ),
    );
    // 排版
    $g_tasks = array(
     0 => array(0), // 封面封底
     1 => array(1),
     2 => array(2),
     3 => array(3),
     4 => array(4,5,6),
     5 => array(7),
     6 => array(8),
     7 => array(9,10,11),
     8 => array(12),
     9 => array(13),
     10 => array(14,15,16),
     11 => array(17),
     12 => array(18),
     13 => array(19,20,21),
     14 => array(22),
     15 => array(23),
     16 => array(24,25,26),
     17 => array(27,28,29),
     18 => array(30),
     19 => array(31),
     20 => array(32,33,34),
     21 => array(35),
     22 => array(36),
     23 => array(37),
     24 => array(38,39,40,41),
     25 => array(42,43,44),
     26 => array(45),
     27 => array(46),
     28 => array(47,48,49),
     29 => array(50),
     30 => array(51),
    );
    // 获取文件夹下的所有图片名
    $jpgs = array();
    $files = scandir($src_path); // 目录下所有文件名
    foreach($files as $file){
     $path_parts = pathinfo($src_path.'/'.$file);
     if($path_parts['extension'] == 'jpg'){
      $jpgs[] = $src_path.'/'.$file;
     }
    }
    // 判断图片总数
    if(count($jpgs) != 52){
     echo '图片总数有误:'.count($jpgs).'/52'.nl2br("\n");
     die();
    }
    // 自然排序
    usort($jpgs, "strnatcmp");
    foreach($g_tasks as $page=>$photos){
     $files = array();
     foreach($photos as $r){
      $files[] = $jpgs[$r];
     }
     $image_all = imagemake($files);
     $filename = $page.'.jpg';
     imagejpeg($image_all, $dst_path.'/'.$filename);
     unset($files);
     echo $filename.nl2br("\n");
    }
    echo 'ok'.nl2br("\n");
    die();
    /**
     * 合成图片
     * @param array $images 本页图片集合
     * @return resource 合成后的图片
     */
    function imagemake($files=array()){
     global $g_width,$g_height,$g_models;
     // 合成后的图片
     $image_all = imageCreatetruecolor($g_width,$g_height);
     // 为真彩色画布创建白色背景
     $color = imagecolorallocate($image_all, 255, 255, 255);
     imagefill($image_all, 0, 0, $color);
    // imageColorTransparent($image_all, $color); // 背景透明
     //function imagecopyresampled ($dst_image, $src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
     // 排版合成
     $type = count($files);
     switch($type){
      case 2:
       break;
      case 1:
      case 3:
      case 4:
       // 用于合成的图片集
       $images = array();
       // 修正图片
       for($i=0;$i$type;$i++){
        $images[] = imagecropper($files[$i],$g_models[$type][$i]['w'],$g_models[$type][$i]['h']);
       }
       // 排版合成
       for($i=0;$i$type;$i++){
        imagecopyresampled($image_all,$images[$i],
         $g_models[$type][$i]['x'],$g_models[$type][$i]['y'],0,0,
         $g_models[$type][$i]['w'],$g_models[$type][$i]['h'],imagesx($images[$i]),imagesy($images[$i]));
       }
       break;
      default:
       break;
     }
     return $image_all;
    }
    /**
     * 修剪图片:居中裁剪等比缩放
     * @param $source_path 原图路径
     * @param $target_width 目标宽度
     * @param $target_height 目标高度
     * @return bool|resource
     */
    function imagecropper($source_path, $target_width, $target_height){
     $source_info = getimagesize($source_path);
     $source_width = $source_info[0];
     $source_height = $source_info[1];
     $source_mime = $source_info['mime'];
     $source_ratio = $source_height / $source_width;
     $target_ratio = $target_height / $target_width;
     switch ($source_mime)
     {
      case 'image/gif':
       $source_image = imagecreatefromgif($source_path);
       break;
      case 'image/jpeg':
       $source_image = imagecreatefromjpeg($source_path);
       break;
      case 'image/png':
       $source_image = imagecreatefrompng($source_path);
       break;
      default:
       return false;
       break;
     }
     // 横竖构图不同,旋转
     if(($target_width-$target_height)*($source_width-$source_height)0){
      // 旋转
      $source_image = imagerotate($source_image, 90, 0);
      $source_width = $source_info[1]; // [0]
      $source_height = $source_info[0]; // [1]
      $source_ratio = $source_height / $source_width;
     }
     // 源图过高
     if ($source_ratio > $target_ratio)
     {
      $cropped_width = $source_width;
      $cropped_height = $source_width * $target_ratio;
      $source_x = 0;
      $source_y = ($source_height - $cropped_height) / 2;
     }
     // 源图过宽
     elseif ($source_ratio  $target_ratio)
     {
      $cropped_width = $source_height / $target_ratio;
      $cropped_height = $source_height;
      $source_x = ($source_width - $cropped_width) / 2;
      $source_y = 0;
     }
     // 源图适中
     else
     {
      $cropped_width = $source_width;
      $cropped_height = $source_height;
      $source_x = 0;
      $source_y = 0;
     }
     $target_image = imagecreatetruecolor($target_width, $target_height);
     $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);
     // 裁剪
     imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
     // 缩放
     imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);
     return $target_image;
    }
    
    

    PS:该代码应用于命令行模式,且需要注意图片文件夹路径。

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《PHP数学运算技巧总结》

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

    您可能感兴趣的文章:
    • PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
    • php图片合成方法(多张图片合成一张)
    • PHP将身份证正反面两张照片合成一张图片的代码
    • PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
    • PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
    • php curl优化下载微信头像的方法总结
    • PHP仿微信多图片预览上传实例代码
    • PHP实现微信图片上传到服务器的方法示例
    • 微信小程序上传图片到php服务器的方法
    • PHP 图片合成、仿微信群头像的方法示例
    上一篇:PHP封装的XML简单操作类完整实例
    下一篇:浅谈PHP中如何实现Hook机制
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】 PHP,实,现将,几张,照片,拼接,