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

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

猜你喜欢

转载自blog.csdn.net/zxz_1991/article/details/26001009