PHP处理bmp格式图片的步骤

  白天QA提出项目上传图片有问题,具体为:上传成功,预览失败。我去了之后,又上传了几张其他的图片可以上传,然后仔细问了下他上传的是哪张图片,看了后使用getimagesize函数打印了下。本文主要和大家介绍了PHP处理bmp格式图片的方法,结合具体实例形式分析了PHP操作bmp格式图片的相关函数与使用技巧,需要的朋友可以参考下,希望能帮助到大家。
 
  Array
 
  (
 
  [0]=>494
 
  [1]=>260
 
  [2]=>6
 
  [3]=>width="494"height="260"
 
  [bits]=>24
 
  [mime]=>image/x-ms-bmp
 
  )
 
  仔细看下,上面打印的数组,mime为image/x-ms-bmp,也就是bmp格式的,印象中php的gd库没有处理这个函数,后来我便在配置文件中,只要mime为这种的便不能上传。
 
  晚上回来后,我便在网上查找php处理bmp相关方法,后来终于在stackoverflow中找到了,帖子里说进入官网的有关imagecreate的函数评论,有个ImageCreateFromBMP方法,先把bmp格式的文件给此函数调用,再用imagejpeg保存就行,后来试了下,发现imagepng也行,下面贴出代码。
 
  
 
  
 
  
 
  
 
  
 
  <?php
 
  functionImageCreateFromBMP($filename){
 
  //Ouverturedufichierenmodebinaire
 
  if(!$f1=fopen($filename,"rb"))
 
  returnFALSE;
 
  //1:Chargementdesent�tesFICHIER
 
  $FILE=unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset",fread($f1,14));
 
  if($FILE['file_type']!=19778)
 
  returnFALSE;
 
  //2:Chargementdesent�tesBMP
 
  $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;
 
  //3:Chargementdescouleursdelapalette
 
  $PALETTE=array();
 
  if($BMP['colors']<16777216){
 
  $PALETTE=unpack('V'.$BMP['colors'],fread($f1,$BMP['colors']*4));
 
  }
 
  //4:Cr�ationdel'image
 
  $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'];
 
  }
 
  //Fermeturedufichier
 
  fclose($f1);
 
  return$res;
 
  }
 
  $pic='2.bmp';
 
  $res=ImageCreateFromBMP($pic);
 
  imagepng($res,'1.webp');
 
  imagejpeg($res,'1.webp');





本文转载自中文网

 

推荐阅读