PHP仿GD打开BMP格式图片
/** * 类似GD库打开图片, 打开bmp格式图片 * $file : 图片路径 */ 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) && ($suffix == 1)) { break; } if(feof($f)) { break; } while(!(($prefix == 0) && ($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) { $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) && ($suffix==1)) { break; } if(feof($f)) { break; } while(!(($prefix == 0) && ($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; }