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

函数|缩略图

/**

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

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

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

*

* 转载请保留完整信息

*

* @author Austin Chin <austinfay@hotmail.com> 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");

}

时间: 2024-08-03 04:25:48

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

C# 生成高质量缩略图程序—终极算法_实用技巧

先看代码: using System; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; /**//// <summary> ///  /// **生成高质量缩略图程序** ///  ///  File: GenerateThumbnail.cs ///  ///  Author: 周振兴 (Zxjay 飘遥) ///  ///  E-Mail: tda7264@163.com

asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式

asp.net|函数|缩略图 在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式.         /**//// <summary>        /// 生成缩略图        /// </summary>        /// <param na

ASP.NET生成高质量缩略图通用函数(c#代码)

asp.net|函数|缩略图 在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式.         /// <summary>        /// 生成缩略图        /// </summary>        /// <param name=&

ASP.NET生成高质量缩略图通用函数

在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.下面帖出完整的代码(带详细注释),参考了网上的一些文章及.net sdk相关内容.QQROOM网络家园的图片上传用到了所有的4种生成方式. /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePath">源图路径(物理路径)&l

ASP.NET 生成高质量缩略图代码

asp.net|缩略图  private static Size NewSize(int maxWidth, int maxHeight, int width, int height)  {   double w = 0.0;   double h = 0.0;   double sw = Convert.ToDouble(width);   double sh = Convert.ToDouble(height);   double mw = Convert.ToDouble(maxWidth

高质量外链的五种分类

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 高质量外链提升网站权重的基本常识是站长们知道的,反响链接的的种类基本上也分为5点,新传播链接商城就以上几点做出一些基本的分析,高质量外链的搜索引擎优化模式通过SEO高手们长期的探索研究已从简单的AB互连演变出了多种模式来更快的获取权重. 1. 关系合作法 通过关系寻找几个百度GOOGLE等收录差不多的站,实行直线循环链接.即A链向B,B链向C

线上“人人贷”模式的反思:以“低速度”换取“高质量”

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对绝大多数创业者而言,能拿到千万级别的投资绝对是一件值得大书特书的喜事,然而对拍拍贷来说,在关于得到沈南鹏2500万美元投资的消息放出之后,他们首先做的却是发表澄清声明. 这是一份奇怪而耐人寻味的声明,因为原来的报道中并没有"与事实不符"的信息,与其说拍拍贷在"澄清"事实,不如说它是借着这个机会向外界释

用Rails创建高质量Web应用

越来越多的企业开始选择Rails作为Web应用的框架.Rails曾经还主要是一些轻公司的选择,但今天一些"重"企业(比如保险.金融等行业的企业)也开始把Rails纳入内部应用甚至外部应用的考虑范围.我最近服务过的客户是国外某大型保险公司,该公司就选择了Rails来创建他们的保险销售网站. 选择Rails的原因,是因为它快速构建的能力,是因为它是Web开发的DSL.但是否选择了Rails就代表了高效开发?是否在Rails上创建的Web应用就一定是高质量的?答案是否定的.从我参与过的几个R

解析TD-LTE寻求高质量组网

TD-LTE规模网络具备正式测试条件"从TD-SCDMA建设经验 来看,如果组网技术这一关不过的话,是难以把一个标准.一个设备形成可运营网络的,这是我们十分重要的一条经验."中国移动通信集团设计院有限公司副院长张同须在日前举行的"2011TD-LTE组网技术研讨会"上表示,"一个标准的形成需要时间,从标准形成到设备需要时间,从设备到建成高质量可运营的网络需要更长的时间."众所周知,TD-LTE规模试验网在上海.广州.深圳.杭州.南京.厦门等6个城