仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1940|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:高质量缩略图的生成函数(多种剪切形式...

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:29:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
学校并没有那么多的时间可以让我们在实际开发上面。函数|缩略图   /**

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

* 在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");

}
  怎么样出来了吧,怎么样自己也可以写出php程序了,虽然离职业和专业的人还有很远,但是好的开始是成功的一半。这个时候改怎么做了呢。现在就是拿1本高手推荐的书,重头到尾读1遍,我说的这个读是自己看。
兰色精灵 该用户已被删除
沙发
发表于 2015-2-4 13:14:08 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
再现理想 该用户已被删除
板凳
发表于 2015-2-4 22:30:44 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
简单生活 该用户已被删除
地板
发表于 2015-2-6 16:31:37 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
admin 该用户已被删除
5#
发表于 2015-3-5 16:41:09 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
因胸联盟 该用户已被删除
6#
发表于 2015-3-11 11:08:25 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-18 07:30:30 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
灵魂腐蚀 该用户已被删除
8#
发表于 2015-3-25 13:14:29 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
山那边是海 该用户已被删除
9#
发表于 2015-3-27 01:16:40 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
深爱那片海 该用户已被删除
10#
发表于 2015-4-2 11:09:23 | 只看该作者
做为1门年轻的语言,php一直很努力。
飘灵儿 该用户已被删除
11#
发表于 2015-4-7 00:37:12 | 只看该作者
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
变相怪杰 该用户已被删除
12#
发表于 2015-4-16 22:12:04 | 只看该作者
爱上php,他也会爱上你。
爱飞 该用户已被删除
13#
发表于 2015-4-18 12:17:12 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
只想知道 该用户已被删除
14#
发表于 2015-4-27 10:18:06 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
金色的骷髅 该用户已被删除
15#
发表于 2015-5-11 21:21:50 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
小妖女 该用户已被删除
16#
发表于 2015-6-4 19:17:03 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
冷月葬花魂 该用户已被删除
17#
发表于 2015-6-18 16:08:18 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
蒙在股里 该用户已被删除
18#
发表于 2015-6-23 01:56:20 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
老尸 该用户已被删除
19#
发表于 2015-7-8 20:54:19 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
20#
发表于 2015-7-11 18:35:01 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 21:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表