Posted in PHP onJuly 16, 2012
大家都知道php GD库可方便的从URL新建一图像, GD中有imagecreatefromjpeg(),imagecreatefromPNG()....等之类的FUNCTION 可有时从URL中读取的切BMP图像而 可恨的是 GD2中切偏偏没有imageCreateFromBMP() 虽然有imagecreatefromWBMP() 但还是相差还是很远!
用下面FUNCTION可以方便解决
function imagecreatefrombmp($file) { global $CurrentBit, $echoMode; $f=fopen($file,"r"); $Header=fread($f,2); if($Header=="BM") { $Size=freaddword($f); $Reserved1=freadword($f); $Reserved2=freadword($f); $FirstByteOfImage=freaddword($f); $SizeBITMAPINFOHEADER=freaddword($f); $Width=freaddword($f); $Height=freaddword($f); $biPlanes=freadword($f); $biBitCount=freadword($f); $RLECompression=freaddword($f); $WidthxHeight=freaddword($f); $biXPelsPerMeter=freaddword($f); $biYPelsPerMeter=freaddword($f); $NumberOfPalettesUsed=freaddword($f); $NumberOfImportantColors=freaddword($f); if($biBitCount<24) { $img=imagecreate($Width,$Height); $Colors=pow(2,$biBitCount); for($p=0;$p<$Colors;$p++) { $B=freadbyte($f); $G=freadbyte($f); $R=freadbyte($f); $Reserved=freadbyte($f); $Palette[]=imagecolorallocate($img,$R,$G,$B); } if($RLECompression==0) { $Zbytek=(4-ceil(($Width/(8/$biBitCount)))%4)%4; for($y=$Height-1;$y>=0;$y--) { $CurrentBit=0; for($x=0;$x<$Width;$x++) { $C=freadbits($f,$biBitCount); imagesetpixel($img,$x,$y,$Palette[$C]); } if($CurrentBit!=0) {freadbyte($f);} for($g=0;$g<$Zbytek;$g++) freadbyte($f); } } } if($RLECompression==1) //$BI_RLE8 { $y=$Height; $pocetb=0; while(true) { $y--; $prefix=freadbyte($f); $suffix=freadbyte($f); $pocetb+=2; $echoit=false; if($echoit)echo "Prefix: $prefix Suffix: $suffix<BR>"; if(($prefix==0)and($suffix==1)) break; if(feof($f)) break; while(!(($prefix==0)and($suffix==0))) { if($prefix==0) { $pocet=$suffix; $Data.=fread($f,$pocet); $pocetb+=$pocet; if($pocetb%2==1) {freadbyte($f); $pocetb++;} } if($prefix>0) { $pocet=$prefix; for($r=0;$r<$pocet;$r++) $Data.=chr($suffix); } $prefix=freadbyte($f); $suffix=freadbyte($f); $pocetb+=2; if($echoit) echo "Prefix: $prefix Suffix: $suffix<BR>"; } for($x=0;$x<strlen($Data);$x++) { imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]); } $Data=""; } } if($RLECompression==2) //$BI_RLE4 { $y=$Height; $pocetb=0; /*while(!feof($f)) echo freadbyte($f)."_".freadbyte($f)."<BR>";*/ while(true) { //break; $y--; $prefix=freadbyte($f); $suffix=freadbyte($f); $pocetb+=2; $echoit=false; if($echoit)echo "Prefix: $prefix Suffix: $suffix<BR>"; if(($prefix==0)and($suffix==1)) break; if(feof($f)) break; while(!(($prefix==0)and($suffix==0))) { if($prefix==0) { $pocet=$suffix; $CurrentBit=0; for($h=0;$h<$pocet;$h++) $Data.=chr(freadbits($f,4)); if($CurrentBit!=0) freadbits($f,4); $pocetb+=ceil(($pocet/2)); if($pocetb%2==1) {freadbyte($f); $pocetb++;} } if($prefix>0) { $pocet=$prefix; $i=0; for($r=0;$r<$pocet;$r++) { if($i%2==0) { $Data.=chr($suffix%16); } else { $Data.=chr(floor($suffix/16)); } $i++; } } $prefix=freadbyte($f); $suffix=freadbyte($f); $pocetb+=2; if($echoit) echo "Prefix: $prefix Suffix: $suffix<BR>"; } for($x=0;$x<strlen($Data);$x++) { imagesetpixel($img,$x,$y,$Palette[ord($Data[$x])]); } $Data=""; } } if($biBitCount==24) { $img=imagecreatetruecolor($Width,$Height); $Zbytek=$Width%4; for($y=$Height-1;$y>=0;$y--) { for($x=0;$x<$Width;$x++) { $B=freadbyte($f); $G=freadbyte($f); $R=freadbyte($f); $color=imagecolorexact($img,$R,$G,$B); if($color==-1) $color=imagecolorallocate($img,$R,$G,$B); imagesetpixel($img,$x,$y,$color); } for($z=0;$z<$Zbytek;$z++) freadbyte($f); } } return $img; } fclose($f); } function freadbyte($f) { return ord(fread($f,1)); } function freadword($f) { $b1=freadbyte($f); $b2=freadbyte($f); return $b2*256+$b1; } function freaddword($f) { $b1=freadword($f); $b2=freadword($f); return $b2*65536+$b1; }
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@