加入收藏 | 设为首页 | 会员中心 | 我要投稿 珠海站长网 (https://www.0756zz.cn/)- 云服务器、边缘计算、基础存储、云计算、中间件!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php将bmp格式图片转换成jpg格式程序

发布时间:2022-07-28 10:20:41 所属栏目:PHP教程 来源:互联网
导读:function imagebmp($img,$file=,$rle=0) { $colorcount=imagecolorstotal($img); $transparent=imagecolortransparent($img); $istransparent=$transparent!=-1; if($istransparent) $colorcount--; if($colorcount==0) {$colorcount=0; $bitcount=24;}; if(
  function imagebmp($img,$file="",$rle=0)
  {
   
   
  $colorcount=imagecolorstotal($img);
   
  $transparent=imagecolortransparent($img);
  $istransparent=$transparent!=-1;
   
   
  if($istransparent) $colorcount--;
   
  if($colorcount==0) {$colorcount=0; $bitcount=24;};
  if(($colorcount>0)and($colorcount<=2)) {$colorcount=2; $bitcount=1;};
  if(($colorcount>2)and($colorcount<=16)) { $colorcount=16; $bitcount=4;};
  if(($colorcount>16)and($colorcount<=256)) { $colorcount=0; $bitcount=8;};
   
   
                  $width=imagesx($img);
                  $height=imagesy($img);
   
                  $zbytek=(4-($width/(8/$bitcount))%4)%4;
   
                  if($bitcount<24) $palsize=pow(2,$bitcount)*4;
   
                  $size=(floor($width/(8/$bitcount))+$zbytek)*$height+54;
                  $size+=$palsize;
                  $offset=54+$palsize;
   
                  // bitmap file header
                  $ret = 'bm';                        // header (2b)
                  $ret .= int_to_dword($size);        // size of file (4b)
                  $ret .= int_to_dword(0);        // reserved (4b)
                  $ret .= int_to_dword($offset);        // byte location in the file which is first byte of image (4b)
                  // bitmap info header
                  $ret .= int_to_dword(40);        // size of bitmapinfoheader (4b)
                  $ret .= int_to_dword($width);        // width of bitmap (4b)
                  $ret .= int_to_dword($height);        // height of bitmap (4b)
                  $ret .= int_to_word(1);        // biplanes = 1 (2b)
                  $ret .= int_to_word($bitcount);        // bibitcount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 mil)} (2b)
                  $ret .= int_to_dword($rle);        // rle compression (4b)
                  $ret .= int_to_dword(0);        // width x height (4b)
                  $ret .= int_to_dword(0);        // bixpelspermeter (4b)
                  $ret .= int_to_dword(0);        // biypelspermeter (4b)
                  $ret .= int_to_dword(0);        // number of palettes used (4b)
                  $ret .= int_to_dword(0);        // number of important colour (4b)
                  // image data
   
                  $cc=$colorcount;
                  $sl1=strlen($ret);
                  if($cc==0) $cc=256;
                  if($bitcount<24)
                     {
                      $colortotal=imagecolorstotal($img);
                       if($istransparent) $colortotal--;
   
                       for($p=0;$p<$colortotal;$p++)
                       {
                        $color=imagecolorsforindex($img,$p);
                         $ret.=inttobyte($color["blue"]);
                         $ret.=inttobyte($color["green"]);
                         $ret.=inttobyte($color["red"]);
                         $ret.=inttobyte(0); //reserved
                       };
   
                      $ct=$colortotal;
                    for($p=$colortotal;$p<$cc;$p++)
                         {
                        $ret.=inttobyte(0);
                        $ret.=inttobyte(0);
                        $ret.=inttobyte(0);
                        $ret.=inttobyte(0); //reserved
                       };
                     };
   
   
  if($bitcount<=8)
  {
   
   for($y=$height-1;$y>=0;$y--)
   {
    $bwrite="";
    for($x=0;$x<$width;$x++)
     {
     $color=imagecolorat($img,$x,$y);
     $bwrite.=decbinx($color,$bitcount);
     if(strlen($bwrite)==8)
      {
       $retd.=inttobyte(bindec($bwrite));
       $bwrite="";
      };
     };
   
    if((strlen($bwrite)<8)and(strlen($bwrite)!=0))
      {
       $sl=strlen($bwrite);
       for($t=0;$t<8-$sl;$t++)
        $sl.="0";
       $retd.=inttobyte(bindec($bwrite));
      };
   for($z=0;$z<$zbytek;$z++)
     $retd.=inttobyte(0);
   };
  };
   
  if(($rle==1)and($bitcount==8))
  {
   for($t=0;$t<strlen($retd);$t+=4)
    {
     if($t!=0)
     if(($t)%$width==0)
      $ret.=chr(0).chr(0);
   
     if(($t+5)%$width==0)
     {
       $ret.=chr(0).chr(5).substr($retd,$t,5).chr(0);
       $t+=1;
     }
     if(($t+6)%$width==0)
      {
       $ret.=chr(0).chr(6).substr($retd,$t,6);
       $t+=2;
      }
      else
      {
       $ret.=chr(0).chr(4).substr($retd,$t,4);
      };
    };
    $ret.=chr(0).chr(1);
  }
  else
  {
  $ret.=$retd;
  };
   
   
                  if($bitcount==24)
                  {
                  for($z=0;$z<$zbytek;$z++)
                   $dopl.=chr(0);
   
                  for($y=$height-1;$y>=0;$y--)
                   {
                   for($x=0;$x<$width;$x++)
                          {
                             $color=imagecolorsforindex($img,imagecolorat($img,$x,$y));
                             $ret.=chr($color["blue"]).chr($color["green"]).chr($color["red"]);
                          }
                   $ret.=$dopl;
                   };
   
                   };
   
    if($file!="")
     {
      $r=($f=fopen($file,"w"));
      $r=$r and fwrite($f,$ret);
      $r=$r and fclose($f);
      return $r;
     }
    else
    {
     echo $ret;
    };
  };
   
   
  /*
  *------------------------------------------------------------
  *                    imagecreatefrombmp
  *------------------------------------------------------------
  *            - reads image from a bmp file
  *
  *         parameters:  $file - target file to load
  *
  *            returns: image id
  */
   
  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="";
   
  };
   
  }; 

(编辑:珠海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读