天天看點

(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

                        /*while(!feof($f))

                        echo freadbyte($f)."_".freadbyte($f)."<BR>";*/

                                //break;

                                                $CurrentBit=0;

                                                for($h=0;$h<$pocet;$h++)

                                                $Data.=chr(freadbits($f,4));

                                                if($CurrentBit!=0) freadbits($f,4);

                                                $pocetb+=ceil(($pocet/2));

                                                $i=0;

                                                {

                                                        if($i%2==0)

                                                        {

                                                                $Data.=chr($suffix%16);

                                                        }

                                                        else

                                                                $Data.=chr(floor($suffix/16));

                                                        $i++;

                                                }

                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);

}