php 原生图片压缩方法

 `1.  //-----------ImageCheck.class.php------------------
2.  <?
3.  /*
4.  php缩略图函数:
5.  等比例无损压缩,可填充补充色 
6.  主持格式:bmp 、jpg 、gif、png
7.  param:
8.  @srcimage : 要缩小的图片
9.  @dstimage : 要保存的图片
10.  @dst_width: 缩小宽
11.  @dst_height: 缩小高
12.  @backgroundcolor: 补充色 如:#FFFFFF 支持 6位 不支持3位
13.  */
14.  class ImageCheck{
15.  public    function imagezoom($srcimage,$dstimage,$dst_width,$dst_height,$backgroundcolor ){
16.  // 中文件名乱码
17.  if ( PHP_OS == 'WINNT' ) {
18.  $srcimage = iconv('UTF-8','GBK',$srcimage);
19.  $dstimage = iconv('UTF-8','GBK',$dstimage);
20.  }
21.  $dstimg = imagecreatetruecolor( $dst_width, $dst_height );
22.  $color = imagecolorallocate($dstimg,hexdec(substr($backgroundcolor, 1, 2)),hexdec(substr($backgroundcolor, 3, 2)),hexdec(substr($backgroundcolor, 5, 2)));
23.  //echo $srcimage;
24.  imagefill($dstimg, 0, 0, $color);
25.  //dump(getimagesize($srcimage));
26.  if ( !$arr=getimagesize($srcimage) ) {
27.  echo "要生成缩略图的文件不存在";
28.  exit;
29.  }
30.  $src_width = $arr[0];
31.  $src_height = $arr[1];
32.  $srcimg =null;
33.  $method =$this->getcreatemethod($srcimage);
34.  if ( $method ) {
35.  eval( '$srcimg ='.$method.';');
36.  }
37.  $dst_x = 0;
38.  $dst_y = 0;
39.  $dst_w = $dst_width;
40.  $dst_h = $dst_height;
41.  if ( ($dst_width / $dst_height - $src_width / $src_height) > 0 ) {
42.  $dst_w = $src_width * ( $dst_height / $src_height );
43.  $dst_x = ( $dst_width - $dst_w ) / 2;
44.  } elseif ( ($dst_width / $dst_height - $src_width / $src_height) < 0 ) {
45.  $dst_h = $src_height * ( $dst_width / $src_width );
46.  $dst_y = ( $dst_height - $dst_h ) / 2;
47.  }
48.  imagecopyresampled($dstimg,$srcimg,$dst_x,$dst_y,0,0,$dst_w,$dst_h,$src_width,$src_height);
49.  // 保存格式
50.  $arr = array(
51.  'jpg' => 'imagejpeg', 
52.  'jpeg' => 'imagejpeg', 
53.  'png' => 'imagepng', 
54.  'gif' => 'imagegif', 
55.  'bmp' => 'imagebmp'
56.  );
57.  $suffix = strtolower(array_pop(explode('.', $dstimage ) ) );
58.  if (!in_array($suffix,array_keys($arr))) {
59.  echo "保存的文件名错误";
60.  exit;
61.  } else {
62.  eval( $arr[$suffix] . '($dstimg, "'.$dstimage.'");' );
63.  }
64.  imagejpeg($dstimg,$dstimage);
65.  imagedestroy($dstimg);
66.  imagedestroy($srcimg);
67.  }
68.  //*************************************************************
69.  public function getcreatemethod($file){
70.  $arr = array(
71.  '474946' => "imagecreatefromgif('$file')",
72.  'FFD8FF' => "imagecreatefromjpeg('$file')",
73.  '424D' => "imagecreatefrombmp('$file')",
74.  '89504E' => "imagecreatefrompng('$file')"
75.  );
76.  $fd = fopen( $file, "rb" );
77.  $data = fread( $fd, 3 );
78.  $data =$this->str2hex( $data );
79.  if( array_key_exists( $data, $arr ) ) {
80.  return $arr[$data];
81.  }else if( array_key_exists( substr($data, 0, 4), $arr ) ) {
82.  return $arr[substr($data, 0, 4)];
83.  }else{
84.  return false;
85.  }
86.  }
87.  //**********************************************************
88.  public function str2hex( $str ) {
89.  $ret = "";
90.  for( $i = 0; $i < strlen( $str ) ; $i++ ) {
91.  $ret .= ord($str[$i]) >= 16 ? strval( dechex( ord($str[$i]) ) ):'0'.strval( dechex( ord($str[$i]) ) );
92.  }
93.  return strtoupper( $ret );
94.  } 
95.  //***********************************************************
96.  public function imagecreatefrombmp($filename){
97.  if (! $f1 = fopen($filename,"rb")) return FALSE;
98.  $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));
99.  if ($FILE['file_type'] != 19778) return FALSE;
100.  $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.'/Vcompression/Vsize_bitmap/Vhoriz_resolution'.'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));
101.  $BMP['colors'] = pow(2,$BMP['bits_per_pixel']);
102.  if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];
103.  $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;
104.  $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);
105.  $BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);
106.  $BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);
107.  $BMP['decal'] = 4-(4*$BMP['decal']);
108.  if ($BMP['decal'] == 4) $BMP['decal'] = 0;
109.  $PALETTE = array();
110.  if ($BMP['colors'] < 16777216)
111.  {
112.  $PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));
113.  }
114.  $IMG = fread($f1,$BMP['size_bitmap']);
115.  $VIDE = chr(0);
116.  $res = imagecreatetruecolor($BMP['width'],$BMP['height']);
117.  $P = 0;
118.  $Y = $BMP['height']-1;
119.  while ($Y >= 0)
120.  {
121.  $X=0;
122.  while ($X < $BMP['width'])
123.  {
124.  if ($BMP['bits_per_pixel'] == 24)
125.  $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
126.  else if ($BMP['bits_per_pixel'] == 16){
127.  $COLOR = unpack("n",substr($IMG,$P,2));
128.  $COLOR[1] = $PALETTE[$COLOR[1]+1];
129.  }else if ($BMP['bits_per_pixel'] == 8){
130.  $COLOR = unpack("n",$VIDE.substr($IMG,$P,1));
131.  $COLOR[1] = $PALETTE[$COLOR[1]+1];
132.  }else if ($BMP['bits_per_pixel'] == 4){
133.  $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
134.  if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);
135.  $COLOR[1] = $PALETTE[$COLOR[1]+1];
136.  }else    if ($BMP['bits_per_pixel'] == 1){
137.  $COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));
138.  if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;
139.  elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;
140.  elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;
141.  elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;
142.  elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;
143.  elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;
144.  elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;
145.  elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);
146.  $COLOR[1] = $PALETTE[$COLOR[1]+1];
147.  }else
148.  return FALSE;
149.  imagesetpixel($res,$X,$Y,$COLOR[1]);
150.  $X++;
151.  $P += $BMP['bytes_per_pixel'];
152.  }
153.  $Y--;
154.  $P+=$BMP['decal'];
155.  }
156.  fclose($f1);
157.  return $res;
158.  } 
159.  //*********************************BMP保存函数*************************************************
160.  public function imagebmp ($im, $fn = false){
161.  if (!$im) return false;
162.  if ($fn === false) $fn = 'php://output';
163.  $f = fopen ($fn, "w");
164.  if (!$f) return false;
165.  $biWidth = imagesx ($im);
166.  $biHeight = imagesy ($im);
167.  $biBPLine = $biWidth * 3;
168.  $biStride = ($biBPLine + 3) & ~3;
169.  $biSizeImage = $biStride * $biHeight;
170.  $bfOffBits = 54;
171.  $bfSize = $bfOffBits + $biSizeImage;
172.  fwrite ($f, 'BM', 2);
173.  fwrite ($f, pack ('VvvV', $bfSize, 0, 0, $bfOffBits));
174.  fwrite ($f, pack ('VVVvvVVVVVV',40,$biWidth, $biHeight,1,24,0, $biSizeImage,0,0,0,0));
175.  $numpad = $biStride - $biBPLine;
176.  for ($y = $biHeight - 1; $y >= 0; --$y)
177.  {
178.  for ($x = 0; $x < $biWidth; ++$x)
179.  {
180.  $col = imagecolorat ($im, $x, $y);
181.  fwrite ($f, pack ('V', $col), 3);
182.  }
183.  for ($i = 0; $i < $numpad; ++$i)
184.  {
185.  fwrite ($f, pack ('C', 0));
186.  }
187.  fclose ($f);
188.  return true;
189.  } 
190.  }    
191.  }
192.  ?> 
193.  //----------调用-------------------------
194.  $image=new ImageCheck();
195.  $image->imagezoom("./Common/upload/news/20130712/liu.jpg","./Common/upload/news/20130712/liu.jpg",100,100,"#FFFFFF");
196.  同名将覆盖

复制代码

<embed id="ZeroClipboardMovie_1" src="http://www.thinkphp.cn/Public/common/zclip/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="82" height="29" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=82&amp;height=29" wmode="transparent">` 

 <think id="ad196de4c105c1d8be" parse="1" style="display: block; overflow: hidden;">**【推广】** [【选型推荐】0基础1小时建站,](https://e.topthink.com/api/go/ec34217f6d305d7d1)</think>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容