首页 / 知识
PHP处理bmp格式图片的步骤
2023-04-11 15:05:00
白天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');
本文转载自中文网 |
最新内容
相关内容
python如何读取列表中元素的位置?
python如何读取列表中元素的位置?,位置,数据,异常,培训,字符串,元素,索引,方法,示例,结果,python读取列表中元素位置的方法:1、使用index()方python中获取路径的三种方法
python中获取路径的三种方法,工作,代码,情况,培训,下来,路径,文件,也就是,桌面,目录,python中获取路径总结下来分为三种情况:1、获取工作目录python如何调用另一个文件夹中的内
python如何调用另一个文件夹中的内容?,系统,培训,文件,模块,内容,路径,函数,所在,前缀,语句,python中调用另外一个文件夹中的内容:1、同一文件如何在python代码中指定保存的文件
如何在python代码中指定保存的文件格式,代码,培训,文件格式,格式,二进制文件,文件,后缀,以上,方法,更多,python指定保存文件格式的方法:1、保Python如何复制文件中的内容
Python如何复制文件中的内容,盘中,数据,培训,文件,内容,方法,文件夹,路径,源文件,文件名,python复制文件中内容的方法:1、使用shutil.copyfilepython的闭包函数是什么
python的闭包函数是什么,代码,工作,函数,培训,程序,外部,个数,变量,嵌套,赋值,python中的闭包,又称闭包函数或者闭合函数,其实和前面讲的嵌套函python的time怎么使用
python的time怎么使用,时间,平台,单位,实时,标准,培训,术语,模块,函数,精度,python中的time模块time这个模块提供各种与时间相关的函数。相关python怎么处理json
python怎么处理json,培训,数据,数字,字符串,数据类型,字典,模块,之间,功能,文件,python的Json模块提供了四个功能:dumps、dump、loads、loadpipython如何设置编码格式
python如何设置编码格式,代码,培训,一致,声明,文件,头部,格式,注释,中文,以下,如果要在python2的py文件里面写中文,则必须要添加一行声明文件pythonc语言取余和python取余的区
pythonc语言取余和python取余的区别,培训,资料,语言,负数,区别,被除数,符号,除数,规定,余数,今天看书发现python与C的负数取余运算结果不同,python如何定义接受参数的函数
python如何定义接受参数的函数,信息,培训,位置,参数,函数,列子,效果,定义,更多,内容,python中的函数可以有参数,也可以无参数,参数可以分为默认python能判断一个变量的类型吗
python能判断一个变量的类型吗,培训,类型,对象,变量,函数,实例,语法,以上,参数,结果,python中是可以判断对象的类型的,判断python中的对象类型