zoukankan      html  css  js  c++  java
  • (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;
    }

     
     
     
     
     
  • 相关阅读:
    大型项目使用Automake/Autoconf完成编译配置
    用C语言编写Windows服务程序的五个步骤
    RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)
    libuv和libev 异步I/O库的比较
    zlog 程序日志的库 交叉编译(Linux生成ARM库,观察执行步骤)
    应用服务
    EvnetBus
    this指向
    CPU使用率
    数据量小,创建索引有必要吗
  • 原文地址:https://www.cnblogs.com/zhwl/p/2593517.html
Copyright © 2011-2022 走看看