zoukankan      html  css  js  c++  java
  • 记php多张图片合成一张图片 压缩固定分辨率 合并生成竖列 纵向长图(可用于商品详情图合并下载)

    <?php
    namespace appmapicommonimage;
    /**
     * 拼接多幅图片成为一张图片
     *
     * 参数说明:原图片为文件路径数组,目的图片如果留空,则不保存结果
     *
     * 例子:
     * <code>
     * $ci = new CombineImage(array("./uploads/1.jpg", "./uploads/2.png"), "./uploads/3.png");
     * $ci->combine();
     * $ci->show();
     * </code>
     *
     * @author yangjianhui
     * @version 2020/6/13
     */
    class CombineImage
    {
        /**
         * 原图地址数组
         */
        private $srcImages;
        /**
         * 每张图片缩放到这个宽度
         */
        private $width;
        /**
         * 每张图片缩放到这个高度
         */
        private $height;
        /**
         * 目标图片地址
         */
        private $destImage;
    
        /**
         * 临时画布
         */
        private $canvas;
    
        /**
         * CombineImage constructor.
         *
         * @param array $srcImages 需要图片路径数组
         * @param string $desImage 输出目标图片地址
         * @param int $width 输出后图片宽度
         * @param int $height 输出后图片高度
         */
        public function __construct(array $srcImages, $desImage = '', $width = 750, $height = 12144)
        {
            $this->srcImages = $srcImages;
            $this->destImage = $desImage;
            $this->width     = $width;
            $this->height    = $height;
            $this->canvas    = NULL;
        }
    
        public function __destruct()
        {
            if ($this->canvas != NULL) {
                imagedestroy($this->canvas);
            }
        }
    
        /**
         * 合并图片
         */
        public function combine()
        {
            if (empty($this->srcImages) || $this->width == 0 || $this->height == 0) {
                return;
            }
    
           /*压缩图片 计算压缩后的图片高度*/
           /*获取所有图片高度*/
            $heightAll = 0;
            for ($i = 0; $i < count($this->srcImages); $i++) {
                $srcImage = $this->srcImages[$i];
                list($srcWidth, $srcHeight, $fileType) = getimagesize($srcImage);
                
                if ($fileType == 2) {
                    $srcImage = imagecreatefromjpeg($srcImage);
                } else if ($fileType == 3) {
                    $srcImage = imagecreatefrompng($srcImage);
                } else {
                    continue;
                }
                
                $new_width = $srcWidth;//压缩后的图片宽
                $new_height = $srcHeight;//压缩后的图片高
         
                if($srcWidth >= 750){
                    $per = 750 / $srcWidth;//计算比例
                    $new_width = $srcWidth * $per;
                    $new_height = $srcHeight * $per;
                }
                
                
                // $heightAll+=$srcHeight;
                $heightAll+=$new_height;
            }     
            
            /*设置画布总高度 并固定宽度  开始压缩合成图片*/
            $this->height = $heightAll;
            $this->width = 750;
            $this->createCanvas();
        
            for ($i = 0; $i < count($this->srcImages); $i++) {
                $srcImage = $this->srcImages[$i];
                //获取原图的基本信息(切记不要https)
                list($srcWidth, $srcHeight, $fileType) = getimagesize($srcImage);
                
                $new_width = $srcWidth;//压缩后的图片宽
                $new_height = $srcHeight;//压缩后的图片高
         
                if($srcWidth >= 750){
                    $per = 750 / $srcWidth;//计算比例
                    $new_width = $srcWidth * $per;
                    $new_height = $srcHeight * $per;
                }        
                
                
                if ($fileType == 2) {
                    // 原图是 jpg 类型
                    $srcImage = imagecreatefromjpeg($srcImage);
                } else if ($fileType == 3) {
                    // 原图是 png 类型
                    $srcImage = imagecreatefrompng($srcImage);
                } else {
                    // 无法识别的类型
                    continue;
                }
    
                // 计算当前原图片应该位于画布的哪个位置
                $destX     = 0;
                
                if ($i == 0) {
                    $desyY     = 0;
                    $desyY_pre  = $new_height;
                } else {
                    $desyY += $desyY_pre;
                    $desyY_pre = $new_height;
                }
                // $desyY += $srcHeight;
                // echo $i."--".$srcHeight."--".$desyY."
    ";
                imagecopyresampled($this->canvas, $srcImage, $destX, $desyY,
                    0, 0, $new_width, $new_height, $srcWidth, $srcHeight);
                // echo $desyY.'--';
            }
            
            // die;
            // 如果有指定目标地址,则输出到文件
            if (!empty($this->destImage)) {
                $this->output();
            }
        }
    
        /**
         * 输出结果到浏览器
         */
        public function show()
        {
            if ($this->canvas == NULL) {
                return;
            }
            header("Content-type: image/jpeg");
            imagejpeg($this->canvas);
        }
    
        /**
         * 私有函数,创建画布
         */
        private function createCanvas()
        {
            ini_set('memory_limit', '256M');
            $this->canvas = imagecreatetruecolor($this->width, $this->height);
            // 使画布透明
            $white = imagecolorallocate($this->canvas, 255, 255, 255);
            imagefill($this->canvas, 0, 0, $white);
            imagecolortransparent($this->canvas, $white);
        }
    
        /**
         * 私有函数,保存结果到文件
         */
        private function output()
        {
            // 获取目标文件的后缀
            $fileType = substr(strrchr($this->destImage, '.'), 1);
            if ($fileType == 'jpg' || $fileType == 'jpeg') {
                imagejpeg($this->canvas, $this->destImage);
            } else {
                // 默认输出 png 图片
                imagepng($this->canvas, $this->destImage);
            }
    
        }
        /*图片压缩*/
        public function compressedImage($imgsrc, $imgdst) {
            list($width, $height, $type) = getimagesize($imgsrc);
           
            $new_width = $width;//压缩后的图片宽
            $new_height = $height;//压缩后的图片高
     
            if($width >= 750){
                $per = 750 / $width;//计算比例
                $new_width = $width * $per;
                $new_height = $height * $per;
            }
     
            switch ($type) {
                case 1:
                    $giftype = check_gifcartoon($imgsrc);
                    if ($giftype) {
                        header('Content-Type:image/gif');
                        $image_wp = imagecreatetruecolor($new_width, $new_height);
                        $image = imagecreatefromgif($imgsrc);
                        imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                        //90代表的是质量、压缩图片容量大小
                        imagejpeg($image_wp, $imgdst, 90);
                        imagedestroy($image_wp);
                        imagedestroy($image);
                    }
                    break;
                case 2:
                    header('Content-Type:image/jpeg');
                    $image_wp = imagecreatetruecolor($new_width, $new_height);
                    $image = imagecreatefromjpeg($imgsrc);
                    imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                    //90代表的是质量、压缩图片容量大小
                    imagejpeg($image_wp, $imgdst, 90);
                    imagedestroy($image_wp);
                    imagedestroy($image);
                    break;
                case 3:
                    header('Content-Type:image/png');
                    $image_wp = imagecreatetruecolor($new_width, $new_height);
                    $image = imagecreatefrompng($imgsrc);
                    imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
                    //90代表的是质量、压缩图片容量大小
                    imagejpeg($image_wp, $imgdst, 90);
                    imagedestroy($image_wp);
                    imagedestroy($image);
                    break;
            }
        }    
        
    }
    
    ?>
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/liiu/p/14029426.html
Copyright © 2011-2022 走看看