PHP imagecreatefrombmp 从BMP文件或URL新建一图像

时间:2022-05-12 00:19:45

大家都知道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;