首页 > 开发 > PHP > 正文

高质量缩略图的生成函数(多种剪切模式,按高度宽度最佳缩放等)

2024-05-04 22:53:48
字体:
来源:转载
供稿:网友
/**

* 可扩展的缩略图生成函数

* 在http://yodoo.com的论坛里可以获得最新版本(注册用户)

* 演示效果也请登录http://yodoo.com看看,该站所有的缩略图(jpg,png)都是使用该函数生成的

*

* 转载请保留完整信息

*

* @author austin chin <[email protected]> http://yodoo.com

* @version $revision: 1.7 $

*

*

* version

*

* + 表示增加的功能

* - 表示丢弃的功能

* c 表示修正的功能

* e 表示扩展了功能

*

* v1.5

* makethumb($srcfile, $dstfile, $dstw, $dsth, $option=1)

*

* v1.6

* + 增加了剪切模式

* + $option 8: 宽度最佳缩放

* + $option 16: 高度最佳缩放

* makethumb($srcfile, $dstfile, $dstw, $dsth, $option=1, $cutmode=0, $startx=0,

*     $starty=0)

*

* v1.7

* e 返回值改为数组,第一个元素是代码 0 表示正常, 其它位错误代码;第二个元素是错误描述。

* 错误代码:

* -1 源文件不存在。

* -2 不支持的图片输出函数

* -3 不支持的图片创建函数

* -4 http头信息已经输出,无法向浏览器输出图片。

* -5 无法检测输出的图片类型

* + 增加函数 message2image 可以把字符串输出成图片格式

*/





/**

* 可扩展的缩略图生成函数

*

* @param string $srcfile 源文件

* @param string $srcfile 目标文件

* @param int $dstw 目标图片的宽度(单位:像素)

* @param int $dsth 目标图片的高度(单位:像素)

* @param int $option 附加参数,可以相加使用,如1+2(或者 1|2)表示同时执行1和2的功能。

*      1: 默认,输出到指定文件 2: 图片内容输出到浏览器 4: 不保持图片比例

*      8:宽度最佳缩放 16:高度最佳缩放

* @param int $cutmode 剪切模式 0: 默认模式,剪切模式 1: 左或上 2: 中 3: 右或下

* @param int $startx 剪切的起始横坐标(像素)

* @param int $starty 剪切的起始纵坐标(像素)

* @return array return[0]=0: 正常; return[0] 为错误代码 return[1] string: 错误描述

*/

define(op_to_file, 1);              //输出到指定文件

define(op_output, 2);               //图片内容输出到浏览器

define(op_not_keep_scale, 4);       //不保持图片比例, 即使用拉伸

define(op_best_resize_width, 8);    //宽度最佳缩放

define(op_best_resize_height, 16);  //高度最佳缩放



define(cm_default,  0);             // 默认模式

define(cm_left_or_top,  1);         // 左或上

define(cm_middle,       2);         // 中

define(cm_right_or_bottom,  3);     // 右或下



function makethumb($srcfile, $dstfile, $dstw, $dsth, $option=op_to_file,

    $cutmode=cm_default, $startx=0, $starty=0) {



    $img_type = array(1=>"gif", 2=>"jpeg", 3=>"png");

    $type_idx = array("gif"=>1, "jpg"=>2, "jpeg"=>2, "jpe"=>2, "png"=>3);



    if (!file_exists($srcfile)) {

        return array(-1, "source file not exists: $srcfile.");

    }



    $path_parts = @pathinfo($dstfile);

    $ext = strtolower ($path_parts["extension"]);

    if ($ext == "") {

        return array(-5, "can't detect output image's type.");

    }

    $func_output = "image" . $img_type[$type_idx[$ext]];

    if (!function_exists ($func_output)) {

        return array(-2, "function not exists for output:$func_output.");

    }



    $data = @getimagesize($srcfile);

    $func_create = "imagecreatefrom" . $img_type[$data[2]];

    if (!function_exists ($func_create)) {

        return array(-3, "function not exists for create:$func_create.");

    }



    $im = @$func_create($srcfile);



    $srcw = @imagesx($im);

    $srch = @imagesy($im);

    $srcx = 0;

    $srcy = 0;

    $dstx = 0;

    $dsty = 0;

   



    if ($option & op_best_resize_width) {

        $dsth = round($dstw * $srch / $srcw);

    }



    if ($option & op_best_resize_height) {

        $dstw = round($dsth * $srcw / $srch);

    }



    $fdstw = $dstw;

    $fdsth = $dsth;



    if ($cutmode != cm_default) { // 剪切模式 1: 左或上 2: 中 3: 右或下

        $srcw -= $startx;

        $srch -= $starty;

        if ($srcw*$dsth > $srch*$dstw) {

            $testw = round($dstw * $srch / $dsth);

            $testh = $srch;

        } else {

            $testh = round($dsth * $srcw / $dstw);

            $testw = $srcw;

        }

        switch ($cutmode) {

            case cm_left_or_top: $srcx = 0; $srcy = 0; break;

            case cm_middle: $srcx = round(($srcw - $testw) / 2);

                            $srcy = round(($srch - $testh) / 2); break;

            case cm_right_or_bottom: $srcx = $srcw - $testw;

                                     $srcy = $srch - $testh;

        }

        $srcw = $testw;

        $srch = $testh;

        $srcx += $startx;

        $srcy += $starty;

    } else { // 原始缩放



        if (!($option & op_not_keep_scale)) {

            // 以下代码计算新大小,并保持图片比例

            if ($srcw*$dsth>$srch*$dstw) {

                $fdsth=round($srch*$dstw/$srcw);

                $dsty=floor(($dsth-$fdsth)/2);

                $fdstw=$dstw;

            } else {

                $fdstw=round($srcw*$dsth/$srch);

                $dstx=floor(($dstw-$fdstw)/2);

                $fdsth=$dsth;

            }

       

            $dstx=($dstx<0)?0:$dstx;

            $dsty=($dstx<0)?0:$dsty;

            $dstx=($dstx>($dstw/2))?floor($dstw/2):$dstx;

            $dsty=($dsty>($dsth/2))?floor($dsth/s):$dsty;

        }

    } /// end if ($cutmode != cm_default) { // 剪切模式



    if( function_exists("imagecopyresampled") and

        function_exists("imagecreatetruecolor") ){

        $func_create = "imagecreatetruecolor";

        $func_resize = "imagecopyresampled";

    } else {

        $func_create = "imagecreate";

        $func_resize = "imagecopyresized";

    }



    $newim = @$func_create($dstw,$dsth);

    $black = @imagecolorallocate($newim, 0,0,0);

    $back = @imagecolortransparent($newim, $black);

    @imagefilledrectangle($newim,0,0,$dstw,$dsth,$black);

    @$func_resize($newim,$im,$dstx,$dsty,$srcx,$srcy,$fdstw,$fdsth,$srcw,$srch);



    if ($option & op_to_file) {

        @$func_output($newim,$dstfile);

    }



    if ($option & op_output) {

        if (function_exists("headers_sent")) {

            if (headers_sent()) {

                return array(-4, "http already sent, can't output image to browser.");

            }

        }

        header("content-type: image/" . $img_type[$type_idx[$ext]]);

        @$func_output($newim);

    }



    @imagedestroy($im);

    @imagedestroy($newim);



    return array(0, "ok");

}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表