php 数字bmp,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也行,下面贴出代码。

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

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.png');

imagejpeg($res,'1.jpeg');

66637d98e6f143a0ece9e66f989ac06d.png

本文转载自中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值