当前位置:Gxlcms > PHP教程 > PHPimagecreatefrombmp从BMP文件或URL新建一图像_PHP

PHPimagecreatefrombmp从BMP文件或URL新建一图像_PHP

时间:2021-07-01 10:21:17 帮助过:4人阅读

大家都知道php GD库可方便的从URL新建一图像, GD中有imagecreatefromjpeg(),imagecreatefromPNG()....等之类的FUNCTION 可有时从URL中读取的切BMP图像而 可恨的是 GD2中切偏偏没有imageCreateFromBMP() 虽然有imagecreatefromWBMP() 但还是相差还是很远!
用下面FUNCTION可以方便解决
代码如下:
  1. <br>function imagecreatefrombmp($file) <br>{ <br>global $CurrentBit, $echoMode; <br>$f=fopen($file,"r"); <br>$Header=fread($f,2); <br>if($Header=="BM") <br>{ <br>$Size=freaddword($f); <br>$Reserved1=freadword($f); <br>$Reserved2=freadword($f); <br>$FirstByteOfImage=freaddword($f); <br>$SizeBITMAPINFOHEADER=freaddword($f); <br>$Width=freaddword($f); <br>$Height=freaddword($f); <br>$biPlanes=freadword($f); <br>$biBitCount=freadword($f); <br>$RLECompression=freaddword($f); <br>$WidthxHeight=freaddword($f); <br>$biXPelsPerMeter=freaddword($f); <br>$biYPelsPerMeter=freaddword($f); <br>$NumberOfPalettesUsed=freaddword($f); <br>$NumberOfImportantColors=freaddword($f); <br>if($biBitCount<24) <br>{ <br>$img=imagecreate($Width,$Height); <br>$Colors=pow(2,$biBitCount); <br>for($p=0;$p<$Colors;$p++) <br>{ <br>$B=freadbyte($f); <br>$G=freadbyte($f); <br>$R=freadbyte($f); <br>$Reserved=freadbyte($f); <br>$Palette[]=imagecolorallocate($img,$R,$G,$B); <br>} <br>if($RLECompression==0) <br>{ <br>$Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4; <br>for($y=$Height-1;$y>=0;$y--) <br>{ <br>$CurrentBit=0; <br>for($x=0;$x<$Width;$x++) <br>{ <br>$C=freadbits($f,$biBitCount); <br>imagesetpixel($img,$x,$y,$Palette[$C]); <br>} <br>if($CurrentBit!=0) {freadbyte($f);} <br>for($g=0;$g<$Zbytek;$g++) <br>freadbyte($f); <br>} <br>} <br>} <br>if($RLECompression==1) //$BI_RLE8 <br>{ <br>$y=$Height; <br>$pocetb=0; <br>while(true) <br>{ <br>$y--; <br>$prefix=freadbyte($f); <br>$suffix=freadbyte($f); <br>$pocetb+=2; <br>$echoit=false; <br>if($echoit)echo "Prefix: $prefix Suffix: $suffix<br>"; <br>if(($prefix==0)and($suffix==1)) break; <br>if(feof($f)) break; <br>while(!(($prefix==0)and($suffix==0))) <br>{ <br>if($prefix==0) <br>{ <br>$pocet=$suffix; <br>$Data.=fread($f,$pocet); <br>$pocetb+=$pocet; <br>if($pocetb%2==1) {freadbyte($f); $pocetb++;} <br>} <br>if($prefix>0) <br>{ <br>$pocet=$prefix; <br>for($r=0;$r<$pocet;$r++) <br>$Data.=chr($suffix); <br>} <br>$prefix=freadbyte($f); <br>$suffix=freadbyte($f); <br>$pocetb+=2; <br>if($echoit) echo "Prefix: $prefix Suffix: $suffix<br>"; <br>} <br>for($x=0;$x<strlen($data);$x++) <br="">{ <br>imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]); <br>} <br>$Data=""; <br>} <br>} <br>if($RLECompression==2) //$BI_RLE4 <br>{ <br>$y=$Height; <br>$pocetb=0; <br>/*while(!feof($f)) <br>echo freadbyte($f)."_".freadbyte($f)."<br>";*/ <br>while(true) <br>{ <br>//break; <br>$y--; <br>$prefix=freadbyte($f); <br>$suffix=freadbyte($f); <br>$pocetb+=2; <br>$echoit=false; <br>if($echoit)echo "Prefix: $prefix Suffix: $suffix<br>"; <br>if(($prefix==0)and($suffix==1)) break; <br>if(feof($f)) break; <br>while(!(($prefix==0)and($suffix==0))) <br>{ <br>if($prefix==0) <br>{ <br>$pocet=$suffix; <br>$CurrentBit=0; <br>for($h=0;$h<$pocet;$h++) <br>$Data.=chr(freadbits($f,4)); <br>if($CurrentBit!=0) freadbits($f,4); <br>$pocetb+=ceil(($pocet/2)); <br>if($pocetb%2==1) {freadbyte($f); $pocetb++;} <br>} <br>if($prefix>0) <br>{ <br>$pocet=$prefix; <br>$i=0; <br>for($r=0;$r<$pocet;$r++) <br>{ <br>if($i%2==0) <br>{ <br>$Data.=chr($suffix%16); <br>} <br>else <br>{ <br>$Data.=chr(floor($suffix/16)); <br>} <br>$i++; <br>} <br>} <br>$prefix=freadbyte($f); <br>$suffix=freadbyte($f); <br>$pocetb+=2; <br>if($echoit) echo "Prefix: $prefix Suffix: $suffix<br>"; <br>} <br>for($x=0;$x<strlen($data);$x++) <br="">{ <br>imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]); <br>} <br>$Data=""; <br>} <br>} <br>if($biBitCount==24) <br>{ <br>$img=imagecreatetruecolor($Width,$Height); <br>$Zbytek=$Width%4; <br>for($y=$Height-1;$y>=0;$y--) <br>{ <br>for($x=0;$x<$Width;$x++) <br>{ <br>$B=freadbyte($f); <br>$G=freadbyte($f); <br>$R=freadbyte($f); <br>$color=imagecolorexact($img,$R,$G,$B); <br>if($color==-1) $color=imagecolorallocate($img,$R,$G,$B); <br>imagesetpixel($img,$x,$y,$color); <br>} <br>for($z=0;$z<$Zbytek;$z++) <br>freadbyte($f); <br>} <br>} <br>return $img; <br>} <br>fclose($f); <br>} <br>function freadbyte($f) <br>{ <br>return ord(fread($f,1)); <br>} <br>function freadword($f) <br>{ <br>$b1=freadbyte($f); <br>$b2=freadbyte($f); <br>return $b2*256+$b1; <br>} <br>function freaddword($f) <br>{ <br>$b1=freadword($f); <br>$b2=freadword($f); <br>return $b2*65536+$b1; <br>} </strlen($data);$x++)></strlen($data);$x++)>

人气教程排行