百科 教育 动画 游戏 博览 网址 金融 搜搜 资料
触屏版

close ◇ 读取数据,请稍候 Loading...

.: Welcome to flymote.com [flymot.com] :.



  »

◆ 其它资料:.

缩略图处理函数模块

1970-01-01 08:00:00   李茂祥    原创   阅读: 2449   【本类别其它资料】 【资料库首页
上一篇 收藏 打印 收藏夹 下一篇

本模块主要用来实现缩略图的实现,提供了一些相关的图像处理函数和方法; 对提供的原始图像,按照给定的尺寸来制作相应的缩略图,可以给定一个固定的边框,可以打上水印,输出为文件或直接显示; 文件输出是直接保存在当前域名根目录下的thumb目录下面,文件格式为文件名-宽度-高度.扩展名; 支持的文件格式为 jpg gif png wbmp xbm bmp ,bmp是采用一个开源函数; 注意 GD库对某些数码图片是不支持的,有一些图片处理是不成功的!
〖缩略图处理〗

<?php
/** limaoxiang 李茂祥 (C)2008 基于华陌网开发框架调整
文件说明:--- under PHP4andPHP5 env. ButPHP6?? IDontKnown! ** limaoxiang 2008/11 ** ---

这个文件是系统公共包含文件,作为系统整体框架的一个针对图片处理的功能函数集合而存在(used the GD lib),请保证正常调用!
为便于调用,我将系统框架的核心部分均放PHP的包含路径(includes)下面,请加以注意。
我可能会在以后再加个专门的类来处理图片,而图片处理类也将根据这个函数库改写出来,功能保持一致(在很多地方使用类实例更方便操作)

//在网页里面的调用缩略图:   图片名称和路径,width,height,0
echo "<img src='".getThumb("images/c_hh.jpg",230,300,0)."'>"; //创建缩略图并调用

//在网页里面的调用缩略图:   图片名称和路径,width,height,第二域名,图片原图物理路径
echo "<img src='".findThumb("images/c_hh.jpg",140,150,"http://www.worldsh.com","D:/apache/htdocs/html/2007/worldsh/upload/" )("images/c_hh.jpg",230,300,0)."'>"; //这是用在一个地方(如expo.worldsh.com)调用另一个地方(如www.worldsh.com)图片的情况下,是跨域的;如果没有缩略图,就按照指定的位置找到原图创建缩略图

//直接显示缩略图在浏览器里面,启用边框、水印:  
$extends = array(
'copyresampled'=>
 array('sx'=>0,'sy'=>0,'dx'=>0,'dy'=>0,'sw'=>232,'sh'=>74),
"watermark"=>
 array("image"=>"d:/apache/htdocs/html/2007/worldsh/cn/share/images/logo.gif","place"=>9,"alpha"=>80),
"border"=>
 array("color"=>"red","width"=>2,"border_w"=>230,"border_h"=>300)
);
renderImage("images/c_hh.jpg","","","",115,37,$extends);

---------------------------------- 李茂祥 2008/11 --------------------------------
*/
error_reporting(E_ALL^E_NOTICE);
$pic_extensions = array("jpg","gif","jpeg","peg","png","bmp");//peg 也是对jpeg的
$suffixes=array("Bytes","KB","MB","GB","TB","PB");
define("JPG_QUALITY", 70);

$colour = array(
 'aliceblue'     => array(240, 248, 255),
 'antiquewhite'  => array(250, 235, 215),
 'aqua'          => array(0, 255, 255),
 'aquamarine'    => array(127, 255, 212),
 'azure'         => array(240, 255,  255),
 'beige'         => array(245, 245, 220),
 'bisque'        => array(255, 228, 196),
 'black'         => array(0, 0, 0),
 'blanchedalmond'=> array(255, 235, 205),
 'blue'          => array(0, 0, 255),
 'blueviolet'    => array(138, 43, 226),
 'brown'         => array(165, 42, 42),
 'burlywood'     => array(222, 184, 135),
 'cadetblue'     => array(95, 158, 160),
 'chartreuse'    => array(127, 255, 0),
 'chocolate'     => array(210, 105, 30),
 'coral'         => array(255, 127, 80),
 'cornflowerblue'=> array(100, 149,  237),
 'cornsilk'      => array(255, 248, 220),
 'crimson'       => array(220, 20, 60),
 'cyan'          => array(0, 255, 255),
 'darkblue'      => array(0, 0, 13),
 'darkcyan'      => array(0, 139, 139),
 'darkgoldenrod' => array(184, 134, 11),
 'darkgray'      => array(169, 169, 169),
 'darkgreen'     => array(0, 100, 0),
 'darkkhaki'     => array(189, 183, 107),
 'darkmagenta'   => array(139, 0, 139),
 'darkolivegreen'=> array(85, 107, 47),
 'darkorange'    => array(255, 140, 0),
 'darkorchid'    => array(153, 50, 204),
 'darkred'       => array(139, 0, 0),
 'darksalmon'    => array(233, 150, 122),
 'darkseagreen'  => array(143, 188, 143),
 'darkslateblue' => array(72, 61, 139),
 'darkslategray' => array(47, 79, 79),
 'darkturquoise' => array(0, 206, 209),
 'darkviolet'    => array(148, 0, 211),
 'deeppink'      => array(255, 20, 147),
 'deepskyblue'   => array(0, 191, 255),
 'dimgray'       => array(105, 105, 105),
 'dodgerblue'    => array(30, 144, 255),
 'firebrick'     => array(178, 34, 34),
 'floralwhite'   => array(255, 250, 240),
 'forestgreen'   => array(34, 139, 34),
 'fuchsia'       => array(255, 0, 255),
 'gainsboro'     => array(220, 220, 220),
 'ghostwhite'    => array(248, 248, 255),
 'gold'          => array(255, 215, 0),
 'goldenrod'     => array(218, 165, 32),
 'gray'          => array(0x80, 0x80, 0x80),
 'green'         => array(0, 128, 0),
 'greenyellow'   => array(173, 255, 47),
 'honeydew'      => array(240, 255, 240),
 'hotpink'       => array(255, 105, 180),
 'indianred'     => array(205, 92, 92),
 'indigo'        => array(75, 0, 130),
 'ivory'         => array(255, 255, 240),
 'khaki'         => array(240, 230, 140),
 'lavender'      => array(230, 230, 250),
 'lavenderblush' => array(255, 240, 245),
 'lawngreen'     => array(124, 252,  0),
 'lemonchiffon'  => array(255, 250, 205),
 'lightblue'     => array(173, 216, 230),
 'lightcoral'    => array(240, 128, 128),
 'lightcyan'     => array(224, 255, 255),
 'lightgoldenrodyellow' => array(250, 250, 210),
 'lightgreen'    => array(144, 238, 144),
 'lightgrey'     => array(211, 211, 211),
 'lightpink'     => array(255, 182, 193),
 'lightsalmon'   => array(255, 160, 122),
 'lightseagreen' => array(32, 178, 170),
 'lightskyblue'  => array(135, 206, 250),
 'lightslategray'=> array(119, 136, 153),
 'lightsteelblue'=> array(176, 196, 222),
 'lightyellow'   => array(255, 255, 224),
 'lime'          => array(0, 255, 0),
 'limegreen'     => array(50, 205, 50),
 'linen'         => array(250, 240, 230),
 'magenta'       => array(255, 0, 255),
 'maroon'        => array(0x80, 0x00, 0x00),
 'mediumaquamarine' => array(102, 205, 170),
 'mediumblue'    => array(0, 0, 205),
 'mediumorchid'  => array(186, 85, 211),
 'mediumpurple'  => array(147, 112, 219),
 'mediumseagreen'=> array(60, 179, 113),
 'mediumslateblue'   => array(123, 104, 238),
 'mediumspringgreen' => array(0, 250, 154),
 'mediumturquoise'   => array(72, 209, 204),
 'mediumvioletred'   => array(199, 21, 133),
 'midnightblue'  => array(25, 25, 112),
 'mintcream'     => array(245, 255, 250),
 'mistyrose'     => array(255, 228, 225),
 'moccasin'      => array(255, 228, 181),
 'navajowhite'   => array(255, 222, 173),
 'navy'          => array(0, 0, 128),
 'oldlace'       => array(253, 245, 230),
 'olive'         => array(128, 128, 0),
 'olivedrab'     => array(107, 142, 35),
 'orange'        => array(255, 165, 0),
 'orangered'     => array(255,69,0),
 'orchid'        => array(218,112,214),
 'palegoldenrod' => array(238,232,170),
 'palegreen'     => array(152,251,152),
 'paleturquoise' => array(175,238,238),
 'palevioletred' => array(219,112,147),
 'papayawhip'    => array(255,239,213),
 'peachpuff'     => array(255,218,185),
 'peru' => array(205,133,63),
 'pink' => array(255,192,203),
 'plum' => array(221,160,221),
 'powderblue' => array(176,224,230),
 'purple' => array(128,0,128),
 'red' => array(255,0,0),
 'rosybrown' => array(188,143,143),
 'royalblue' => array(65,105,225),
 'saddlebrown' => array(139,69,19),
 'salmon' => array(250,128,114),
 'sandybrown' => array(244,164,96),
 'seagreen' => array(46,139,87),
 'seashell' => array(255,245,238),
 'sienna' => array(160,82,45),
 'silver' => array(192,192,192),
 'skyblue' => array(135,206,235),
 'slateblue' => array(106,90,205),
 'slategray' => array(112,128,144),
 'snow' => array(255,250,250),
 'springgreen' => array(0,255,127),
 'steelblue' => array(70,130,180),
 'tan' => array(210,180,140),
 'teal' => array(0,128,128),
 'thistle' => array(216,191,216),
 'tomato' => array(255,99,71),
 'turquoise' => array(64,224,208),
 'violet' => array(238,130,238),
 'wheat' => array(245,222,179),
 'white' => array(255,255,255),
 'whitesmoke' => array(245,245,245),
 'yellow' => array(255,255,0),
 'yellowgreen' => array(154,205,50),
 'grayf0' => array(0xF0, 0xF0, 0xF0),
 'grayee' => array(0xEE, 0xEE, 0xEE),
 'gray33' => array(0x33, 0x33, 0x33),
 'gray66' => array(0x66, 0x66, 0x66),
 'gray99' => array(0x99, 0x99, 0x99),
 'graycc' => array(0xCC, 0xCC, 0xCC),
 'darkyellow1' => array(0xbf,0xb3,0x7d),
 'darkyellow' => array(0xb1,0x70,0x0e)
 );
/**
* 将gb2312字符转换为unicode编码,GD库处理中文需要unicode编码
* @param string $text 字符串
* @return string 返回unicode编码格式字符串
*/
function gb23122uni($text) {
 $rtext="";
 $max=strlen($text);
 for($i=0;$i<$max;$i++){
  $h=ord($text[$i]);
  if($h>=160 && $i<$max-1){
   $rtext.="&#".base_convert(bin2hex(iconv("gb2312","ucs-2",substr($text,$i,2))),16,10).";";
   $i++;
  }else{
   $rtext.=$text[$i];
  }
 }
 return $rtext;
}

/**
* 在图片中写文字,支持中文
* @param resource $im 图像资源对象,注意是引用
* @param string $text 要输出的字符串
* @param int $size 字符大小
* @param int $x 字符串左下角X坐标
* @param int $y 字符串左下角Y坐标
* @param int $angle 字符串角度
* @param string $color 颜色字符串
* @param string $font 字符的字体
* @return NULL 直接处理
*/
function printStr(&$im,$text='错误!',$size=20,$x=0,$y=30,$angle=0,$color='red',$font='SIMHEI.TTF'){
global $colour,$colour1;
$color = allocateColor($im, $color);
$text = gb23122uni($text);
// Add some shadow to the text
imagettftext($im, $size, $angle,$x, $y, $color, $font, $text);
}

/**
* 定义颜色,赋给相应的图像资源对象
* @param resource $img 图像资源对象,注意是引用
* @param string $color 颜色字符串
* @return string 返回图像资源对象下相应颜色的标识符 注意:颜色数组colour1的相应定义将被换成标识符
*/
function allocateColor(&$img, $color) {
 global $colour,$colour1;
  $color = trim(strtolower($color));
  $color=preg_replace ( "/[{}()'",:]/","", $color);//去除多余内容,for xhtml2pic 's parser
  if (!isset($colour1[$color]))
   if (!isset($colour[$color]))
    $color1 =$colour['black'];//die("色彩未被定义,请首先定义你选择的色彩!($color)");
   else
    $color1 =$colour[$color];
  else
   $color1 = $colour1[$color];
  if (is_int($color1)) return $color1;
  else
  {
   $colour1[$color] = ImageColorAllocate($img, $color1[0], $color1[1], $color1[2]);
   return $colour1[$color];
  }
}

/**
* 把一个数值,按照文件数据量大小的格式来显示,即??KB
* @param string $size 数值字符串
* @return string 返回指定格式字符串
*/
function getSize($size) {
 global $suffixes;
 $i=0;
 while($size>=1024) {
  $size/=1024;
  $i++;
 }
 return number_format($size,2)." ".$suffixes[$i];
}

/**
* 通过与 MAX_THUMB_WIDTH 和 MAX_THUMB_HEIGHT的比较,获得缩略图的实际大小
* @param int $x 宽度
* @param int $y 高度
* @param int $MAX_THUMB_WIDTH 限定的宽度
* @param int $MAX_THUMB_HEIGHT 限定的高度
* @return array 返回包含相应信息的数组 array(width,height)
*/
function getThumbHW($x,$y,$MAX_THUMB_WIDTH,$MAX_THUMB_HEIGHT){
 if( $x < $MAX_THUMB_WIDTH && $y < $MAX_THUMB_HEIGHT ){
  $dim[0]=$x;
  $dim[1]=$y;
 }
 else{
  $tmp1=$x/$MAX_THUMB_WIDTH;
  $tmp2=$y/$MAX_THUMB_HEIGHT;
  $factor=($tmp1>$tmp2?$tmp1:$tmp2);

  $dim[0]=ceil($x/$factor);
  $dim[1]=ceil($y/$factor);
 }
 return $dim;
}

/**
* 获得图像资源
* @param string $path 图像的路径和名称
* @return array 返回成功否(boolean)与 图像的资源指针数组
*/
function getImg($path){
 $dim = @getimagesize($path);
 
/* 下面是 MIME 列表
imagetype  Returned value
IMAGETYPE_GIF image/gif
IMAGETYPE_JPEG image/jpeg
IMAGETYPE_PNG image/png
IMAGETYPE_SWF application/x-shockwave-flash
IMAGETYPE_PSD image/psd
IMAGETYPE_BMP image/bmp
IMAGETYPE_TIFF_II (intel byte order) image/tiff
IMAGETYPE_TIFF_MM (motorola byte order)  image/tiff
IMAGETYPE_JPC application/octet-stream
IMAGETYPE_JP2 image/jp2
IMAGETYPE_JPX application/octet-stream
IMAGETYPE_JB2 application/octet-stream
IMAGETYPE_SWC application/x-shockwave-flash
IMAGETYPE_IFF image/iff
IMAGETYPE_WBMP image/vnd.wap.wbmp
IMAGETYPE_XBM image/xbm
IMAGETYPE_ICO image/vnd.microsoft.icon
*/
 
 ini_set('memory_limit', '50M');
 
 switch ($dim['mime']) {
 case 'image/jpeg':
  $im = imageCreateFromJPEG($path);
  break;
 case 'image/gif':
  $im = imageCreateFromGIF($path);
  break;
 case 'image/png':
  $im = imageCreateFromPNG($path);
  break;
 case 'image/bmp':
  $im = imagecreatefrombmp($path);
  break;
 case 'image/vnd.wap.wbmp':
  $im = imagecreatefromwbmp($path);
  break;
 case 'image/xbm':
  $im = imagecreatefromxbm($path);
  break;
 default:
  $im = false;
  break;
 }

  if(!$im) { // 如果不成功,形成一个包含错误信息的图片
        $im  = imagecreatetruecolor(250, 60); /* Create a blank image */
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 3, 3, 248, 58, $bgc);
        printStr($im);
        imagestring($im, 1, 5, 45, "Err:$path", $tc);
        return array(false,$im);
  }
  return array(true,$im);
}

/**
* 图象处理的主函数
* @param string $dir 图像的来源路径
* @param string $pic 图像名称
* @param string $dest_dir 新图像的路径
* @param string $dest 新图像名称
* @param int $dw 新图像宽度
* @param int $dh 新图像高度
* @param array $extends 扩展参数,包含如下元素:
array(copyresampled=>array(sx,sy,dx,dy,sw,sh),border=>array(color,width),watermark=>array(image,place,alpha))
 copyresampled 用来实现缩略图或图片的部分截取,这个是基本参数定下:
  int $sx 原图取样点x坐标 int $sy 原图取样点y坐标 int $dx 目标图取样点x坐标 int $dy 目标图取样点y坐标 int $sw 原图取样宽度 int $sh 原图取样高度
 border 用来定边框,定下边框的颜色和宽度;
  string $color 边框的颜色,必须是前面参数中颜色数组已定义过的颜色 string $color_in 边框内部的颜色,必须是前面参数中颜色数组已定义过的颜色 int $width 边框的宽度 int border_h 边框高度(必须大于缩略图限定高度) int $border_w 边框宽度(必须大于缩略图限定宽度)
 watermark 用来定水印,定下:
  string $image 水印图片的位置和名称 int $place 水印位置选择1-9(上中下左中右) int $alpha 水印的透明度0-100
* @return boolean 如果成功得到相应的图片(返回 true),否则返回一个包含错误信息的图片(getImg函数)
*/
function renderImage($dir,$pic,$dest_dir,$dest,$dw,$dh,$extends){
 global $dim,$colour;  //从create_thumb得到,并传递给getImg
$colour1 = array();
$img_info = getImg($dir.$pic);
$im = $img_info[1];
if ($img_info[0]){ //图片成功取得
//var_dump($extends);exit;
if (@$extends['border']){
 $border = @$extends['border']['width']?$extends['border']['width']:1;
 $border_w = (@$extends['border']['border_w']>$dw+$border*2)?$extends['border']['border_w']:$dw+$border*2;
 $border_h = (@$extends['border']['border_h']>$dh+$border*2)?$extends['border']['border_h']:$dh+$border*2;
 $new = imagecreatetruecolor($border_w,$border_h);
}else
 $new = imagecreatetruecolor($dw,$dh);//var_dump($extends);
 if($new){
  if (@$extends['copyresampled']){
   //取样处理,先初始化一些变量
   $sx = @$extends['copyresampled']['sx']?$extends['copyresampled']['sx']:0;
   $sy = @$extends['copyresampled']['sy']?$extends['copyresampled']['sy']:0;
   $dx = @$extends['copyresampled']['dx']?$extends['copyresampled']['dx']:0;
   $dy = @$extends['copyresampled']['dy']?$extends['copyresampled']['dy']:0;
   $sw = @$extends['copyresampled']['sw']?$extends['copyresampled']['sw']:150;
   $sh = @$extends['copyresampled']['sh']?$extends['copyresampled']['sh']:150;
   $dw = $dw?$dw:150;
   $dh = $dh?$dh:150;

   if (@$extends['border']){
   $border_color = @$extends['border']['color']?$extends['border']['color']:"black";
   $color_in = @$extends['border']['color_in']?$extends['border']['color_in']:"darkyellow";
   $color = allocateColor($new,$border_color);
   $color_in = allocateColor($new,$color_in);
   if ($border == 1)
    ImageRectangle($new, 1, 1, $border_w-2, $border_h-2, $color);
   else{
    imagefilledrectangle($new, 0, 0, $border_w, $border_h,$color);
    imagefilledrectangle($new, $border, $border, $border_w-$border, $border_h-$border,$color_in);
    }
    if(!imagecopyresampled($new,$im,round(($border_w-$dw)/2),round(($border_h-$dh)/2),$sx,$sy,$dw,$dh,$sw,$sh))
    return false;
   }else
  if(!imagecopyresampled($new,$im,$dx,$dy,$sx,$sy,$dw,$dh,$sw,$sh))
    return false;
  }

   //水印处理
  if( @$extends['watermark'] ) {
   $dim1 = $dim;
   $dim = array();
   $logo_ = getImg($extends['watermark']['image']);
   $watermark_logo = $logo_[1];
   if (!$logo_[0]) return false;
   $logo_w  = imageSX($watermark_logo);
   $logo_h  = imageSY($watermark_logo);
   $img_w  = @$border_w>$dw?$border_w:$dw;
   $img_h  = @$border_h>$dh?$border_h:$dh;
   $wmwidth = $img_w - $logo_w;
   $wmheight = $img_h - $logo_h;

   $animatedgif = 0;
   if($dim['mime'] == 'image/gif') {
     $temp = file_get_contents($extends['watermark']['image']);
     $animatedgif = strpos($temp, 'NETSCAPE2.0') === FALSE ? 0 : 1;
     unset($temp);
   }
   if( $wmwidth > 10 && $wmheight > 10 && !$animatedgif) {
      switch($extends['watermark']['place']) {
       case 1:
        $x = +5;
        $y = +5;
        break;
       case 2:
        $x = ($img_w - $logo_w) / 2;
        $y = +5;
        break;
       case 3:
        $x = $img_w - $logo_w-5;
        $y = +5;
        break;
       case 4:
        $x = +5;
        $y = ($img_h - $logo_h) / 2;
        break;
       case 5:
        $x = ($img_w  - $logo_w) / 2;
        $y = ($img_h - $logo_h) / 2;
        break;
       case 6:
        $x = $img_w - $logo_w;
        $y = ($img_h - $logo_h) / 2;
        break;
       case 7:
        $x = +5;
        $y = $img_h - $logo_h-5;
        break;
       case 8:
        $x = ($img_w  - $logo_w) / 2;
        $y = $img_h - $logo_h;
        break;
       case 9:
        $x = $img_w - $logo_w-5;
        $y = $img_h - $logo_h-5;
        break;
      }

      imageAlphaBlending($watermark_logo, true);
      imageCopyMerge($new, $watermark_logo, $x, $y, 0, 0, $logo_w, $logo_h, $extends['watermark']['alpha']);
     }
  }//水印 end
 }//处理 end
}else
 $new = $im;

if ($new){   //下面输出
 $temp = $dest_dir.$dest;
 if (empty($temp)) //如果不指定目标路径,直接输出浏览器
  if (!headers_sent($filename, $linenum))
     header('Content-type: ' . $dim1['mime']);
    else
    { 
     echo "<script>alert('图片处理错误:\n\n输出图片前不能有其它信息输出!请检查$filename, $linenum');</script>";
     return false;
  }
 switch ($dim1['mime']) {
 case 'image/gif':
  $ret = @imagegif($new,$temp);
  break;
 case 'image/png':
  $ret = @imagepng($new,$temp);
  break;
 case 'image/vnd.wap.wbmp':
  $ret = @image2wbmp($new,$temp);
  break;
 default: //case 'image/jpeg':
  $ret = @imagejpeg($new,$temp,JPG_QUALITY);
  break;
 }
 unset($dim,$colour1);
 if($ret)
   return true;
 else
   return false;

 @imagedestroy($new);
}
else
 return false;
 @imagedestroy($im);
}

/**
* 创建缩略图象
* @param string $dir 图像的源路径
* @param string $src 源图像的名称
* @param string $dest_dir 新图像的路径
* @param string $dest 新图像的名称
* @param int $MAX_THUMB_WIDTH 限定的宽度
* @param int $MAX_THUMB_HEIGHT 限定的高度
* @param int/array $ext 扩展参数,参见renderImage;如果是1,将自动使用默认参数进行水印处理,默认参数:array("watermark"=>array("image"=>"d:/apache/htdocs/html/2007/worldsh/cn/share/images/logo.gif","place"=>9,"alpha"=>80))
* @return boolean 如果成功得到相应的图片,否则返回一个包含错误信息的图片
*/
function create_thumb($dir,$src,$dest_dir,$dest,$MAX_THUMB_WIDTH,$MAX_THUMB_HEIGHT,$more=0){
 $temp= $dir.$src;
 $dim = @getimagesize($temp);
 if (!$dim )
  return false;
 $thumb = getThumbHW($dim[0],$dim[1],$MAX_THUMB_WIDTH,$MAX_THUMB_HEIGHT);
 if (!isset($more['copyresampled']))
  $extends['copyresampled'] = array('sx'=>0,'sy'=>0,'dx'=>0,'dy'=>0,'sw'=>$dim[0],'sh'=>$dim[1]);
if (is_int($more) && $more)
  $extends["watermark"]= array("image"=>"d:/apache/htdocs/html/2007/worldsh/cn/share/images/logo.gif","place"=>9,"alpha"=>70);
else{
 if (is_array($more['watermark'])) $extends['watermark'] = $more['watermark'];
 if (is_array($more['border'])) $extends['border'] = $more['border'];//var_dump($extends);
}
// var_dump($more,$extends);
 if (renderImage($dir,$src,$dest_dir,$dest,$thumb[0],$thumb[1],$extends))
  return true;
 else return false;
}

/**
* 上传并创建缩略图象
* @param string $input 上传图像的表单中文件上传按钮的id
* @param string $dest_dir 新图像的路径
* @param string $dest 新图像的名称
* @param string $thumb_dest_dir 新缩略图像的路径
* @param string $thumb_dest 新缩略图像的名称
* @param int $MAX_THUMB_WIDTH 限定的宽度
* @param int $MAX_THUMB_HEIGHT 限定的高度
* @param int $over 保存上传的文件时是否覆盖同名文件,1:覆盖
* @return boolean 如果成功得到相应的图片并返回true,否则返回false
*/
function upload($input,$dest_dir,$dest,$thumb_dest_dir,$thumb_dest,$MAX_THUMB_WIDTH,$MAX_THUMB_HEIGHT,$over=1){
global $pic_extensions,$extends;
if($_FILES[$input]['name']!=''){
 $ext=strtolower(substr($_FILES[$input]['name'],-3,3));
 if($pic_extensions[$ext]&&$ext!=''){
  $file = $dest_dir.$dest;
  if(!$over && file_exists($file))
   return false;
  elseif(@move_uploaded_file($_FILES[$input]['tmp_name'],$file))
  { 
   create_thumb($_FILES[$input]['tmp_name'],"",$thumb_dest_dir,$thumb_dest,$MAX_THUMB_WIDTH,$MAX_THUMB_HEIGHT,$extends);
   return true;
  }
  else
   return false;
 } //ext
 else
  return false;
}else
 return false;
}

/**
* 根据图象创建缩略图,显示的其存储路径和文件名,根据域名来自动区分(使用DOCUMENT_ROOT);
注意:缩略图象保存在域名根目录/thumb下面,而文件命名采用 文件名-width-height.扩展名 的形式,如a.jpg的120*110的图,将成为a-120-110.jpg
* @param string $input 原始图像的路径及名称
* @param int $width 缩略图控制的宽度
* @param int $height 缩略图控制的高度
* @param int $mode 显示文件绝对路径还是以网站根开始的路径,默认1文件绝对路径,0网站
* @param int $pop_error 是否出现alert警告,默认1弹出,0不弹出
* @param int $auto_watermark 是否自动启用水印处理,默认是0,不用,这样将根据定义扩展参数数组来处理
* @return string 得到相应的图片缩略图象的存储路径和文件名,否则返回false
*/
function getThumb($input,$width=140,$height=150,$mode=1,$pop_error=1,$auto_watermark=0){
global $extends;
$path = realpath($input);
if (!$path)
 if ($pop_error) {
  echo "<script>alert('发现错误:\n\n 文件 $input 不存在或不能正常访问,请确认文件正常!')</script>";
  return false;
 }else
  return false;
$filename = basename($path);
$temp = strrpos($filename, ".");
$ext_name = substr($filename,$temp+1);
$name = substr($filename,0,$temp);
$small_pic = $name."-".$width."-".$height.".".$ext_name;
if (!is_dir($_SERVER['DOCUMENT_ROOT']."/thumb")) {
  @mkdir( $_SERVER['DOCUMENT_ROOT']."/thumb" );
  @chmod( $_SERVER['DOCUMENT_ROOT']."/thumb",0777 );
};
//var_dump($auto_watermark);
$filename = "/thumb/$small_pic";
$a = $_SERVER['DOCUMENT_ROOT'].$filename;//直接在file_exists 里面if (file_exists(..))会不正常
if (file_exists($a)) {
    return $mode?$_SERVER['DOCUMENT_ROOT'].$filename:$filename;
} else {
  if (fmod(time(),60)) return $input;//限制处理的频率
  if ($auto_watermark) $extends = 1;
    $temp = create_thumb($path,"",$_SERVER['DOCUMENT_ROOT'].$filename,"",$width,$height,$extends);
    if (!$temp && $pop_error) {
  echo "<script>alert('处理缩略图错误:\n\n 文件 $input 缩略图创建失败,请确认文件正常!')</script>";
  return false;
 }
  return $mode?$_SERVER['DOCUMENT_ROOT'].$filename:$filename;
}
}

/**
* 根据bmp图象创建图像,从php.net取得的开源代码,我修改了一点;
* @param string $p_sFile 原始图像的路径及名称
* @return resource 得到相应的图片资源对象,否则返回false
*/
function imagecreatefrombmp($p_sFile)
{
 /*       //    Load the image into a string
        $file    =    fopen($p_sFile,"rb");
        $read    =    fread($file,10);
        while(!feof($file)&&($read<>""))
            $read    .=    fread($file,1024);
*/    
 $read = file_get_contents($p_sFile);//为提高效率进行的修改,但没有直接的文件操作可靠
  if (!$read) return false;
  $temp    =    unpack("H*",$read);
  $hex    =    $temp[1];
  $header    =    substr($hex,0,108);
       
        //    Process the header
        //    Structure: http://www.fastgraph.com/help/bmp_header_format.html
        if (substr($header,0,4)=="424d")
        {
            //    Cut it in parts of 2 bytes
         //php4不能用   $header_parts    =    str_split($header,2);
            $header_parts    =    str_split_cn($header,2,0);
           
            //    Get the width        4 bytes
            $width            =    hexdec($header_parts[19].$header_parts[18]);
           
            //    Get the height        4 bytes
            $height            =    hexdec($header_parts[23].$header_parts[22]);
           
            //    Unset the header params
            unset($header_parts);
        }
       
        //    Define starting X and Y
        $x                =    0;
        $y                =    1;
       
        //    Create newimage
        $image            =    imagecreatetruecolor($width,$height);
       
        //    Grab the body from the image
        $body            =    substr($hex,108);

        //    Calculate if padding at the end-line is needed
        //    Divided by two to keep overview.
        //    1 byte = 2 HEX-chars
        $body_size        =    (strlen($body)/2);
        $header_size    =    ($width*$height);

        //    Use end-line padding? Only when needed
        $usePadding        =    ($body_size>($header_size*3)+4);
       
        //    Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
        //    Calculate the next DWORD-position in the body
        for ($i=0;$i<$body_size;$i+=3)
        {
            //    Calculate line-ending and padding
            if ($x>=$width)
            {
                //    If padding needed, ignore image-padding
                //    Shift i to the ending of the current 32-bit-block
                if ($usePadding)
                    $i    +=    $width%4;
               
                //    Reset horizontal position
                $x    =    0;
               
                //    Raise the height-position (bottom-up)
                $y++;
               
                //    Reached the image-height? Break the for-loop
                if ($y>$height)
                    break;
            }
           
            //    Calculation of the RGB-pixel (defined as BGR in image-data)
            //    Define $i_pos as absolute position in the body
            $i_pos    =    $i*2;
            $r        =    hexdec($body[$i_pos+4].$body[$i_pos+5]);
            $g        =    hexdec($body[$i_pos+2].$body[$i_pos+3]);
            $b        =    hexdec($body[$i_pos].$body[$i_pos+1]);
           
            //    Calculate and draw the pixel
            $color    =    imagecolorallocate($image,$r,$g,$b);
            imagesetpixel($image,$x,$height-$y,$color);
           
            //    Raise the horizontal position
            $x++;
        }
       
        //    Unset the body / free the memory
        unset($body);
       
        //    Return image-object
        return $image;
}

/**
* 在相应位置查找缩略图,根据文件名在域名空间里面查找,按照先当前域名后www主机的顺序
注意:缩略图象保存在域名根目录/thumb下面,而文件命名采用 文件名-width-height.扩展名 的形式,如a.jpg的120*110的图,将成为a-120-110.jpg
这个函数是用在一个地方调用另一个地方图片的情况下,是跨域的;如果没有缩略图,就按照指定的位置找到原图创建缩略图
* @param string $input 原始图像的路径及名称
* @param int $width 缩略图控制的宽度
* @param int $height 缩略图控制的高度
* @param string $domain 当前找不到,找哪里?写域名,默认http://www.worldsh.com (就是在$domain/thumb下找一下)
* @param string $pre 物理路径前缀,默认D:apachehtdocshtml2007worldshupload (就是实在找不到,在这个地方找到原图,用来创建缩略图)
* @param int $auto_watermark 是否自动启用水印处理,默认是0,不用,这样将根据定义扩展参数数组来处理
* @return string 得到相应的图片缩略图象的存储路径和文件名,没有文件就建立缩略图再返回结果
*/
function findThumb($input,$width=140,$height=150,$domain = "http://www.worldsh.com",$pre="D:/apache/htdocs/html/2007/worldsh/upload/",$auto_watermark = 0 ){
global $extends;
$filename = basename($input);
$temp = strrpos($filename, ".");
$ext_name = substr($filename,$temp+1);
$name = substr($filename,0,$temp);
$small_pic = $name."-".$width."-".$height.".".$ext_name;

$filename = "/thumb/$small_pic";
$a = $_SERVER['DOCUMENT_ROOT'].$filename;//直接在file_exists 里面if (file_exists(..))会不正常
if (file_exists($a)) {
    return $filename;
} else {
$a = $domain.$filename;
if (file_exists($a)) {
    return $a; }
else {
 if (!is_dir($_SERVER['DOCUMENT_ROOT']."/thumb")) {
  @mkdir( $_SERVER['DOCUMENT_ROOT']."/thumb" );
  @chmod( $_SERVER['DOCUMENT_ROOT']."/thumb",0777 );
 };
 $temp = basename($input);
 if ($auto_watermark) $extends = 1;
 if (file_exists($pre.$temp))
  $temp = create_thumb($pre,$temp,$_SERVER['DOCUMENT_ROOT'].$filename,"",$width,$height,$extends);
 else{
  echo "<script>alert('处理缩略图错误:指定的文件 $pre$temp 不存在,请确认文件正常!')</script>";
  return false;
  }
  if (!$temp && $pop_error) {
  echo "<script>alert('处理缩略图错误:文件 $input 缩略图创建失败,请确认文件正常!')</script>";
  return false;
 }
  return $filename;
 }
}
}
?>

责任编辑: admin

【最近的搜索】:

上一篇 收藏 打印 收藏夹 下一篇
CopyRight(c) 2007 - 2020 All Rights Reserved  【赣ICP备12001042号】
触屏版 | Archiver 20200527 13:23 | 简介 | 帮助 | 留言 | 关于 | 360网站安全检测平台