PHP缩略图制作函数

{{ time }}

代码如下

<?php

/**
 * makeThumb() 制作缩略图
 * 缩略图制作逻辑
 * 1. 纵横比保持不变
 * 2. 两种方式制作缩略图: 按宽度控制 和 按高度控制
 * 3. 按宽度控制: 如 byWidth=200px, 表示把图片制作成宽度为200px的缩略图, 高度是多少不管
 * 4. 按高度控制: 如 byHeight=200px, 表示把图片制作成高度为200px的缩略图, 宽度是多少不管
 * 
 * @param $path    原图片路径
 * @param $mode    制作缩略图的方式: byWidth是按宽度控制, byHeight是按高度控制
 * @param $value   控制到的像素
 * @param $saveTo  是否保存, 默认false为进行二进制输出; 如果填写路径, 则保存至填写的路径
 */

function makeThumb($path, $mode = 'byWidth', $value, $saveTo = false)
{

    //typeOld说明: 1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM

    //取得图片数据
    $imageData = file_get_contents($path);

    // 获取图像信息
    $imageInfo = getimagesizefromstring($imageData);
    list($widthOld, $heightOld, $typeOld) = $imageInfo;

    //取得缩略图的高度和宽度
    if ($mode == 'byWidth') {
        $percent = $value / $widthOld;
        $width = $value;
        $height = round($heightOld * $percent, 0);
    } elseif ($mode = 'byHeight') {
        $percent = $value / $heightOld;
        $height = $value;
        $width = round($widthOld * $percent, 0);
    }

    // 创建缩略图画板
    $block = imagecreatetruecolor($width, $height);

    // 启用混色模式
    imagealphablending($block, false);

    // 保存PNG alpha通道信息
    imagesavealpha($block, true);

    // 创建原图画板
    $bigImg = imagecreatefromstring($imageData);

    // 缩放
    imagecopyresampled($block, $bigImg, 0, 0, 0, 0, $width, $height, $widthOld, $heightOld);

    //没有填写saveTo, 则保存至临时文件
    if ($saveTo === false) {
        // 生成临时文件名
        $saveToPath = tempnam(sys_get_temp_dir(), 'image_');
    } else {
        $saveToPath = $saveTo;
    }

    // 保存操作
    switch ($typeOld) {
        case 1:
            imagegif($block, $saveToPath);
            break;

        case 2:
            imagejpeg($block, $saveToPath);
            break;

        case 3:
            imagepng($block, $saveToPath);
            break;
    }

    //没有填写saveTo, 则显示
    if ($saveTo === false) {
        // 销毁画布
        imagedestroy($block);

        //再次读取
        $image = file_get_contents($saveToPath);

        //删除临时文件
        unlink($saveToPath);

        //浏览器二进制输出
        header("content-type:image/png");
        echo $image;
    }
}

把以上代码叫做 代码A

好比说 显示 1.jpg 的缩略图, 可以在代码A的最后添加以下代码

makeThumb('./1.jpg', 'byWidth', 400) //生成宽度为400px的缩略图

值得一提的是, 要在浏览器直接输出时, 同一文件如果输出了其他字符, 可能造成图片无法输出

又好比说 要把1.jpg的缩略图保存为2.png, 可以在代码A的最后添加以下代码

makeThumb('./1.jpg', 'byHeight', 400, './2.png'); //保存高度为400px的缩略图为2.png