首页 > 后端开发 > php教程 > 使用PHP生成图片的缩略图的方法_php实例

使用PHP生成图片的缩略图的方法_php实例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-07 17:11:49
原创
926 人浏览过

 功能:支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化。完整类的代码如下:
 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

<&#63;php

/**

 * 功能:php生成缩略图片的类

 */

 class ResizeImage{

  public $type;//图片类型

  public $width;//实际宽度

  public $height;//实际高度

  public $resize_width;//改变后的宽度

  public $resize_height;//改变后的高度

  public $cut;//是否裁图

  public $srcimg;//源图象

  public $dstimg;//目标图象地址

  public $im;//临时创建的图象

  public $quality;//图片质量

  function resizeimage($img,$wid,$hei,$c,$dstpath,$quality=100){

   $this->srcimg=$img;

   $this->resize_width=$wid;

   $this->resize_height=$hei;

   $this->cut=$c;

   $this->quality=$quality;

   $this->type=strtolower(substr(strrchr($this->srcimg,'.'),1));//图片的类型

   $this->initi_img();//初始化图象

   $this -> dst_img($dstpath);//目标图象地址

   @$this->width=imagesx($this->im);

   @$this->height=imagesy($this->im);

   $this->newimg();//生成图象

   @ImageDestroy($this->im);

  }

  function newimg(){

   $resize_ratio=($this->resize_width)/($this->resize_height);//改变后的图象的比例

   @$ratio=($this->width)/($this->height);//实际图象的比例

   if(($this->cut)=='1'){//裁图

    if($img_func==='imagepng'&&(str_replace('.','',PHP_VERSION)>=512)){ //针对php版本大于5.12参数变化后的处理情况

     $quality=9;

    }

    if($ratio>=$resize_ratio){//高度优先

     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);

     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,(($this->height)*$resize_ratio),$this->height);

     imagejpeg($newimg,$this->dstimg,$this->quality);

    }

    if($ratio<$resize_ratio){//宽度优先

     $newimg=imagecreatetruecolor($this->resize_width,$this->resize_height);

     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,$this->resize_height,$this->width,(($this->width)/$resize_ratio));

     imagejpeg($newimg,$this->dstimg,$this->quality);

    }

   }else{//不裁图

    if($ratio>=$resize_ratio){

     $newimg=imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);

     imagecopyresampled($newimg,$this->im,0,0,0,0,$this->resize_width,($this->resize_width)/$ratio,$this->width,$this->height);

     imagejpeg($newimg,$this->dstimg,$this->quality);

    }

    if($ratio<$resize_ratio){

     @$newimg=imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);

     @imagecopyresampled($newimg,$this->im,0,0,0,0,($this->resize_height)*$ratio,$this->resize_height,$this->width,$this->height);

     @imagejpeg($newimg,$this->dstimg,$this->quality);

    }

   }

  }

  function initi_img(){//初始化图象

   if($this->type=='jpg' || $this->type=='jpeg'){

    $this->im=imagecreatefromjpeg($this->srcimg);

   }

   if($this->type=='gif'){

    $this->im=imagecreatefromgif($this->srcimg);

   }

   if($this->type=='png'){

    $this->im=imagecreatefrompng($this->srcimg);

   }

   if($this->type=='wbm'){

    @$this->im=imagecreatefromwbmp($this->srcimg);

   }

   if($this->type=='bmp'){

    $this->im=$this->ImageCreateFromBMP($this->srcimg);

   }

  }

  function dst_img($dstpath){//图象目标地址

   $full_length=strlen($this->srcimg);

   $type_length=strlen($this->type);

   $name_length=$full_length-$type_length;

   $name=substr($this->srcimg,0,$name_length-1);

   $this->dstimg=$dstpath;

   //echo $this->dstimg;

  }

    

  function ImageCreateFromBMP($filename){ //自定义函数处理bmp图片

   if(!$f1=fopen($filename,"rb"))returnFALSE;

   $FILE=unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset",fread($f1,14));

   if($FILE['file_type']!=19778)returnFALSE;

   $BMP=unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.

     '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.

     '/Vvert_resolution/Vcolors_used/Vcolors_important',fread($f1,40));

   $BMP['colors']=pow(2,$BMP['bits_per_pixel']);

   if($BMP['size_bitmap']==0)$BMP['size_bitmap']=$FILE['file_size']-$FILE['bitmap_offset'];

   $BMP['bytes_per_pixel']=$BMP['bits_per_pixel']/8;

   $BMP['bytes_per_pixel2']=ceil($BMP['bytes_per_pixel']);

   $BMP['decal']=($BMP['width']*$BMP['bytes_per_pixel']/4);

   $BMP['decal']-=floor($BMP['width']*$BMP['bytes_per_pixel']/4);

   $BMP['decal']=4-(4*$BMP['decal']);

   if($BMP['decal']==4)$BMP['decal']=0;

   $PALETTE=array();

   if($BMP['colors']<16777216)

   {

    $PALETTE=unpack('V'.$BMP['colors'],fread($f1,$BMP['colors']*4));

   }

   $IMG=fread($f1,$BMP['size_bitmap']);

   $VIDE=chr(0);

   $res=imagecreatetruecolor($BMP['width'],$BMP['height']);

   $P=0;

   $Y=$BMP['height']-1;

   while($Y>=0)

   {

    $X=0;

    while($X<$BMP['width'])

    {

     if($BMP['bits_per_pixel']==24)

      $COLOR=unpack("V",substr($IMG,$P,3).$VIDE);

     elseif($BMP['bits_per_pixel']==16)

     {

      $COLOR=unpack("n",substr($IMG,$P,2));

      $COLOR[1]=$PALETTE[$COLOR[1]+1];

     }

     elseif($BMP['bits_per_pixel']==8)

     {

      $COLOR=unpack("n",$VIDE.substr($IMG,$P,1));

      $COLOR[1]=$PALETTE[$COLOR[1]+1];

     }

     elseif($BMP['bits_per_pixel']==4)

     {

      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));

      if(($P*2)%2==0)$COLOR[1]=($COLOR[1]>>4);else$COLOR[1]=($COLOR[1]&0x0F);

      $COLOR[1]=$PALETTE[$COLOR[1]+1];

     }

     elseif($BMP['bits_per_pixel']==1)

     {

      $COLOR=unpack("n",$VIDE.substr($IMG,floor($P),1));

      if(($P*8)%8==0)$COLOR[1]=$COLOR[1]>>7;

      elseif(($P*8)%8==1)$COLOR[1]=($COLOR[1]&0x40)>>6;

      elseif(($P*8)%8==2)$COLOR[1]=($COLOR[1]&0x20)>>5;

      elseif(($P*8)%8==3)$COLOR[1]=($COLOR[1]&0x10)>>4;

      elseif(($P*8)%8==4)$COLOR[1]=($COLOR[1]&0x8)>>3;

      elseif(($P*8)%8==5)$COLOR[1]=($COLOR[1]&0x4)>>2;

      elseif(($P*8)%8==6)$COLOR[1]=($COLOR[1]&0x2)>>1;

      elseif(($P*8)%8==7)$COLOR[1]=($COLOR[1]&0x1);

      $COLOR[1]=$PALETTE[$COLOR[1]+1];

     }

     else

      returnFALSE;

     imagesetpixel($res,$X,$Y,$COLOR[1]);

     $X++;

     $P+=$BMP['bytes_per_pixel'];

    }

    $Y--;

    $P+=$BMP['decal'];

   }

   fclose($f1);

   return$res;

  }

    

 }

&#63;>

登录后复制

使用方法很简单代码如下:


1

$resizeimage=new ResizeImage('upload/abc.bmp', '120', '90', '0', 'upload/xabc.bmp');

登录后复制


另外一个强大的PHP图片缩略图类:phpThumb

该类除了缩放图片外,还能将图片转换成不同的格式输出(比如将GIF格式的图片输出为PNG格式),其特色功能还包括色彩、特效等

官方网址:http://phpthumb.sourceforge.net/

We'll be using phpThumb , the open source PHP script to generate thumbnails on the fly.

Download and extract phpThumb to somewhere in your website folder. Now to use a rounded corner thumbnail of an image, simply use the img tag of HTML with src as

1

2

3

4

5

6

7

8

9

10

11

<img  src="/static/imghw/default1.png"  data-src="phpThumb/phpThumb.php&#63;src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC"  class="lazy"  src=”phpThumb.php&#63;src=test.jpg&w=200&h=150&fltr[]=ric|20|20&f=png” / alt="使用PHP生成图片的缩略图的方法_php实例" >

 

Adjust the path to phpThumb according to where you place the phpThumb files.

 

<html>

<head>

</head>

<body>

 <img src="/static/imghw/default1.png"  data-src="phpThumb/phpThumb.php&#63;src=../images/test.jpg&w=400&fltr[]=fram|3|2|CC9966|333333|CCCCCC"  class="lazy" alt="">

</body>

</html>

登录后复制

一般只需要下面的文件就可以了

其实phpThumb的功能比我原先想象的要强大一些,下面把他的其他一些有用的参数列一下:

src:目标图片的地址

w:输出图片的宽度

h:输出图片的高度(如果不指定他将按w参数等比缩放)

q:输出如果是JPG格式的,可以规定它的输出质量

bg:输出时的背景(如果需要)

sw、sh、sx、sy:局部输出,宽高、起始位置

f:输出格式,可以为jpeg、png、gif、ico

sfn:输出gif动画中的某一帧

fltr[]:滤镜,可以有很多效果,包括锐化、模糊、旋翻转、水印、边框、遮照、色彩调整等

使用演示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

//加载类库文件

 

 require_once 'path/to/ThumbLib.inc.php';

 

 //实例化类库,传入你要处理的图片的地址可以是网络地址,也可以是本地地址

 

 $thumb = PhpThumbFactory::create('http://www.shlongyingjixie.com/');

 

 //把图片等比缩小到最大宽度 100px或者最高100px,当只输入一个参数的时候,是限制最宽的尺寸。

 

 $thumb->resize(100, 100);

 

 //把图片等比缩小到原来的百分数,比如50就是原来的50%。

 

 $thumb->resizePercent(50);

 

 //截取一个175px * 175px的图片,注意这个是截取,超出的部分直接裁切掉,不是强制改变尺寸。

 $thumb->adaptiveResize(175, 175);

 

 //从图片的中心计算,截取200px * 100px的图片。

 

 $thumb->cropFromCenter(200, 100);

 

 //截图,前两个参数分别是需要解出的图片的右上角的坐标X,Y。 后面两个参数是需要解出的图片宽,高。

 

 $thumb->crop(100, 100, 300, 200);

  

 //把图片顺时针反转180度

 

 $thumb->rotateImageNDegrees(180);

 

 //保存(生成)图片,你可以保存其他格式,详细参考文档

 

 $thumb->save( 'NewPath/Of/image.jpg ' );

登录后复制

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板