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

<?php
namespace app\mapi\common\image;
/**
 * 拼接多幅图片成为一张图片
 *
 * 参数说明:原图片为文件路径数组,目的图片如果留空,则不保存结果
 *
 * 例子:
 * <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."\r\n";
            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;
        }
    }    
    
}

?>

 

posted @ 2020-11-24 11:47  Liiu  阅读(355)  评论(0编辑  收藏  举报