当前位置:首页 > PHP教程 > php函数 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-09 15:30:35 浏览: 评论:0 
  1. function imagebmp($img,$file="",$rle=0) 
  2.  
  3.  
  4. $colorcount=imagecolorstotal($img); 
  5.  
  6. $transparent=imagecolortransparent($img); 
  7. $istransparent=$transparent!=-1; 
  8.  
  9.  
  10. if($istransparent$colorcount--; 
  11.  
  12. if($colorcount==0) {$colorcount=0; $bitcount=24;}; 
  13. if(($colorcount>0)and($colorcount<=2)) {$colorcount=2; $bitcount=1;}; 
  14. if(($colorcount>2)and($colorcount<=16)) { $colorcount=16; $bitcount=4;}; 
  15. if(($colorcount>16)and($colorcount<=256)) { $colorcount=0; $bitcount=8;}; 
  16.  
  17.  
  18.                 $width=imagesx($img); 
  19.                 $height=imagesy($img); 
  20.  
  21.                 $zbytek=(4-($width/(8/$bitcount))%4)%4; 
  22.  
  23.                 if($bitcount<24) $palsize=pow(2,$bitcount)*4; 
  24.  
  25.                 $size=(floor($width/(8/$bitcount))+$zbytek)*$height+54; 
  26.                 $size+=$palsize
  27.                 $offset=54+$palsize
  28.  
  29.                 // bitmap file header 
  30.                 $ret = 'bm';                        // header (2b) 
  31.                 $ret .= int_to_dword($size);        // size of file (4b) 
  32.                 $ret .= int_to_dword(0);        // reserved (4b) 
  33.                 $ret .= int_to_dword($offset);        // byte location in the file which is first byte of image (4b) 
  34.                 // bitmap info header 
  35.                 $ret .= int_to_dword(40);        // size of bitmapinfoheader (4b) 
  36.                 $ret .= int_to_dword($width);        // width of bitmap (4b) 
  37.                 $ret .= int_to_dword($height);        // height of bitmap (4b) 
  38.                 $ret .= int_to_word(1);        // biplanes = 1 (2b) 
  39.                 $ret .= int_to_word($bitcount);        // bibitcount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 mil)} (2b) 
  40.                 $ret .= int_to_dword($rle);        // rle compression (4b) 
  41.                 $ret .= int_to_dword(0);        // width x height (4b) 
  42.                 $ret .= int_to_dword(0);        // bixpelspermeter (4b) 
  43.                 $ret .= int_to_dword(0);        // biypelspermeter (4b) 
  44.                 $ret .= int_to_dword(0);        // number of palettes used (4b) 
  45.                 $ret .= int_to_dword(0);        // number of important colour (4b) 
  46.                 // image data 
  47.  
  48.                 $cc=$colorcount
  49.                 $sl1=strlen($ret); 
  50.                 if($cc==0) $cc=256; 
  51.                 if($bitcount<24) 
  52.                    { 
  53.                     $colortotal=imagecolorstotal($img); 
  54.                      if($istransparent$colortotal--; 
  55.  
  56.                      for($p=0;$p<$colortotal;$p++) 
  57.                      { 
  58.                       $color=imagecolorsforindex($img,$p); 
  59.                        $ret.=inttobyte($color["blue"]); 
  60.                        $ret.=inttobyte($color["green"]); 
  61.                        $ret.=inttobyte($color["red"]); 
  62.                        $ret.=inttobyte(0); //reserved 
  63.                      }; 
  64.  
  65.                     $ct=$colortotal
  66.                   for($p=$colortotal;$p<$cc;$p++) 
  67.                        { 
  68.                       $ret.=inttobyte(0); 
  69.                       $ret.=inttobyte(0); 
  70.                       $ret.=inttobyte(0); 
  71.                       $ret.=inttobyte(0); //reserved 
  72.                      }; 
  73.                    }; 
  74.  
  75.  
  76. if($bitcount<=8) 
  77.  
  78.  for($y=$height-1;$y>=0;$y--) 
  79.  { 
  80.   $bwrite=""
  81.   for($x=0;$x<$width;$x++) 
  82.    { 
  83.    $color=imagecolorat($img,$x,$y); 
  84.    $bwrite.=decbinx($color,$bitcount); 
  85.    if(strlen($bwrite)==8) 
  86.     { 
  87.      $retd.=inttobyte(bindec($bwrite)); 
  88.      $bwrite=""
  89.     }; 
  90.    }; 
  91.  
  92.   if((strlen($bwrite)<8)and(strlen($bwrite)!=0)) 
  93.     { 
  94.      $sl=strlen($bwrite); 
  95.      for($t=0;$t<8-$sl;$t++) 
  96.       $sl.="0"
  97.      $retd.=inttobyte(bindec($bwrite)); 
  98.     }; 
  99.  for($z=0;$z<$zbytek;$z++) 
  100.    $retd.=inttobyte(0); 
  101.  }; 
  102. }; 
  103.  
  104. if(($rle==1)and($bitcount==8)) 
  105.  for($t=0;$t<strlen($retd);$t+=4) 
  106.   { 
  107.    if($t!=0) 
  108.    if(($t)%$width==0) 
  109.     $ret.=chr(0).chr(0); 
  110.  
  111.    if(($t+5)%$width==0) 
  112.    { 
  113.      $ret.=chr(0).chr(5).substr($retd,$t,5).chr(0); 
  114.      $t+=1; 
  115.    } 
  116.    if(($t+6)%$width==0) 
  117.     { 
  118.      $ret.=chr(0).chr(6).substr($retd,$t,6); 
  119.      $t+=2; 
  120.     } 
  121.     else 
  122.     { 
  123.      $ret.=chr(0).chr(4).substr($retd,$t,4); 
  124.     }; 
  125.   }; 
  126.   $ret.=chr(0).chr(1); 
  127. else 
  128. $ret.=$retd
  129. }; 
  130.  
  131.  
  132.                 if($bitcount==24) 
  133.                 { 
  134.                 for($z=0;$z<$zbytek;$z++) 
  135.                  $dopl.=chr(0); 
  136.  
  137.                 for($y=$height-1;$y>=0;$y--) 
  138.                  { 
  139.                  for($x=0;$x<$width;$x++) 
  140.                         { 
  141.                            $color=imagecolorsforindex($img,imagecolorat($img,$x,$y)); 
  142.                            $ret.=chr($color["blue"]).chr($color["green"]).chr($color["red"]); 
  143.                         } 
  144.                  $ret.=$dopl
  145.                  }; 
  146.  
  147.                  }; 
  148.  
  149.   if($file!=""
  150.    { 
  151.     $r=($f=fopen($file,"w")); 
  152.     $r=$r and fwrite($f,$ret); 
  153.     $r=$r and fclose($f); 
  154.     return $r
  155.    } 
  156.   else 
  157.   { 
  158.    echo $ret
  159.   }; 
  160. }; 
  161.  
  162.  
  163. /* 
  164. *------------------------------------------------------------ 
  165. *                    imagecreatefrombmp 
  166. *------------------------------------------------------------ 
  167. *            - reads image from a bmp file 
  168. * 
  169. *         parameters:  $file - target file to load 
  170. * 
  171. *            returns: image id 
  172. */ 
  173.  
  174. function imagecreatefrombmp($file
  175. global  $currentbit$echomode
  176.  
  177. $f=fopen($file,"r"); 
  178. $header=fread($f,2); 
  179.  
  180. if($header=="bm"
  181.  $size=freaddword($f); 
  182.  $reserved1=freadword($f); 
  183.  $reserved2=freadword($f); 
  184.  $firstbyteofimage=freaddword($f); 
  185.  
  186.  $sizebitmapinfoheader=freaddword($f); 
  187.  $width=freaddword($f); 
  188.  $height=freaddword($f); 
  189.  $biplanes=freadword($f); 
  190.  $bibitcount=freadword($f); 
  191.  $rlecompression=freaddword($f); 
  192.  $widthxheight=freaddword($f); 
  193.  $bixpelspermeter=freaddword($f); 
  194.  $biypelspermeter=freaddword($f); 
  195.  $numberofpalettesused=freaddword($f); 
  196.  $numberofimportantcolors=freaddword($f); 
  197.  
  198. if($bibitcount<24) 
  199.  { 
  200.   $img=imagecreate($width,$height); 
  201.   $colors=pow(2,$bibitcount); 
  202.   for($p=0;$p<$colors;$p++) 
  203.    { 
  204.     $b=freadbyte($f); 
  205.     $g=freadbyte($f); 
  206.     $r=freadbyte($f); 
  207.     $reserved=freadbyte($f); 
  208.     $palette[]=imagecolorallocate($img,$r,$g,$b); 
  209.    }; 
  210.  
  211.   
  212.  
  213.  
  214. if($rlecompression==0) 
  215.    $zbytek=(4-ceil(($width/(8/$bibitcount)))%4)%4; 
  216.  
  217. for($y=$height-1;$y>=0;$y--) 
  218.     { 
  219.      $currentbit=0; 
  220.      for($x=0;$x<$width;$x++) 
  221.       { 
  222.          $c=freadbits($f,$bibitcount); 
  223.        imagesetpixel($img,$x,$y,$palette[$c]); 
  224.       }; 
  225.     if($currentbit!=0) {freadbyte($f);}; 
  226.     for($g=0;$g<$zbytek;$g++) 
  227.      freadbyte($f); 
  228.      }; 
  229.  
  230.  }; 
  231. }; 
  232.  
  233.  
  234. if($rlecompression==1) //$bi_rle8 
  235. $y=$height
  236.  
  237. $pocetb=0; 
  238.  
  239. while(true) 
  240. $y--; 
  241. $prefix=freadbyte($f); 
  242. $suffix=freadbyte($f); 
  243. $pocetb+=2; 
  244.  
  245. $echoit=false; 
  246.  
  247. if($echoit)echo "prefix: $prefix suffix: $suffix<br>"
  248. if(($prefix==0)and($suffix==1)) break
  249. if(feof($f)) break
  250.  
  251. while(!(($prefix==0)and($suffix==0))) 
  252.  if($prefix==0) 
  253.   { 
  254.    $pocet=$suffix
  255.    $data.=fread($f,$pocet); 
  256.    $pocetb+=$pocet
  257.    if($pocetb%2==1) {freadbyte($f); $pocetb++;}; 
  258.   }; 
  259.  if($prefix>0) 
  260.   { 
  261.    $pocet=$prefix
  262.    for($r=0;$r<$pocet;$r++) 
  263.     $data.=chr($suffix); 
  264.   }; 
  265.  $prefix=freadbyte($f); 
  266.  $suffix=freadbyte($f); 
  267.  $pocetb+=2; 
  268.  if($echoitecho "prefix: $prefix suffix: $suffix<br>"
  269. }; 
  270.  
  271. for($x=0;$x<strlen($data);$x++) 
  272.  { 
  273.   imagesetpixel($img,$x,$y,$palette[ord($data[$x])]); 
  274.  }; 
  275. $data=""
  276.  
  277. }; 
  278.  
  279. }; 
  280.  
  281.  
  282. if($rlecompression==2) //$bi_rle4 
  283. $y=$height
  284. $pocetb=0; 
  285.  
  286. /*while(!feof($f)) 
  287.  echo freadbyte($f)."_".freadbyte($f)."<br>";*/ 
  288. while(true) 
  289. //break; 
  290. $y--; 
  291. $prefix=freadbyte($f); 
  292. $suffix=freadbyte($f); 
  293. $pocetb+=2; 
  294.  
  295. $echoit=false; 
  296.  
  297. if($echoit)echo "prefix: $prefix suffix: $suffix<br>"
  298. if(($prefix==0)and($suffix==1)) break
  299. if(feof($f)) break
  300.  
  301. while(!(($prefix==0)and($suffix==0))) 
  302.  if($prefix==0) 
  303.   { 
  304.    $pocet=$suffix
  305.  
  306.    $currentbit=0; 
  307.    for($h=0;$h<$pocet;$h++) 
  308.     $data.=chr(freadbits($f,4)); 
  309.    if($currentbit!=0) freadbits($f,4); 
  310.    $pocetb+=ceil(($pocet/2)); 
  311.    if($pocetb%2==1) {freadbyte($f); $pocetb++;}; 
  312.   }; 
  313.  if($prefix>0) 
  314.   { 
  315.    $pocet=$prefix
  316.    $i=0; 
  317.    for($r=0;$r<$pocet;$r++) 
  318.     { 
  319.     if($i%2==0) 
  320.      { 
  321.       $data.=chr($suffix%16); 
  322.      } 
  323.      else 
  324.      { 
  325.       $data.=chr(floor($suffix/16)); 
  326.      }; 
  327.     $i++; 
  328.     }; 
  329.   }; 
  330.  $prefix=freadbyte($f); 
  331.  $suffix=freadbyte($f); 
  332.  $pocetb+=2; 
  333.  if($echoitecho "prefix: $prefix suffix: $suffix<br>"
  334. }; 
  335.  
  336. for($x=0;$x<strlen($data);$x++) 
  337.  { 
  338.   imagesetpixel($img,$x,$y,$palette[ord($data[$x])]); 
  339.  }; 
  340. $data=""
  341.  
  342. }; 
  343.  
  344. }; 
  345.  
  346.  
  347.  if($bibitcount==24) 
  348.  $img=imagecreatetruecolor($width,$height); 
  349.  $zbytek=$width%4; 
  350.  
  351.    for($y=$height-1;$y>=0;$y--) 
  352.     { 
  353.      for($x=0;$x<$width;$x++) 
  354.       { 
  355.        $b=freadbyte($f); 
  356.        $g=freadbyte($f); 
  357.        $r=freadbyte($f); 
  358.        $color=imagecolorexact($img,$r,$g,$b); 
  359.        if($color==-1) $color=imagecolorallocate($img,$r,$g,$b); 
  360.        imagesetpixel($img,$x,$y,$color); 
  361.       } 
  362.     for($z=0;$z<$zbytek;$z++) 
  363.      freadbyte($f); 
  364.    }; 
  365. }; 
  366. return $img
  367.  
  368. }; 
  369.  
  370.  
  371. fclose($f); 
  372.  
  373.  
  374. }; 
  375.  
  376.   
  377.  
  378.   
  379.  
  380. /* 
  381. * helping functions: 
  382. *------------------------- 
  383. * 
  384. * freadbyte($file) - reads 1 byte from $file 
  385. * freadword($file) - reads 2 bytes (1 word) from $file 
  386. * freaddword($file) - reads 4 bytes (1 dword) from $file 
  387. * freadlngint($file) - same as freaddword($file) 
  388. * decbin8($d) - returns binary string of d zero filled to 8 
  389. * retbits($byte,$start,$len) - returns bits $start->$start+$len from $byte 
  390. * freadbits($file,$count) - reads next $count bits from $file 
  391. * rgbtohex($r,$g,$b) - convert $r, $g, $b to hex 
  392. * int_to_dword($n) - returns 4 byte representation of $n 
  393. * int_to_word($n) - returns 2 byte representation of $n 
  394. */ 
  395.  
  396. function freadbyte($f
  397.  return ord(fread($f,1)); 
  398. }; 
  399.  
  400. function freadword($f
  401.  $b1=freadbyte($f); 
  402.  $b2=freadbyte($f); 
  403.  return $b2*256+$b1
  404. }; 
  405.  
  406.  
  407. function freadlngint($f
  408. return freaddword($f); 
  409. }; 
  410.  
  411. function freaddword($f
  412.  $b1=freadword($f); 
  413.  $b2=freadword($f); 
  414.  return $b2*65536+$b1
  415. }; 
  416.  
  417.   
  418.  
  419. function retbits($byte,$start,$len
  420. $bin=decbin8($byte); 
  421. $r=bindec(substr($bin,$start,$len)); 
  422. return $r
  423.  
  424. }; 
  425.  
  426.   
  427.  
  428. $currentbit=0; 
  429. function freadbits($f,$count
  430.  global $currentbit,$smode
  431.  $byte=freadbyte($f); 
  432.  $lastcbit=$currentbit
  433.  $currentbit+=$count
  434.  if($currentbit==8) 
  435.   { 
  436.    $currentbit=0; 
  437.   } 
  438.  else 
  439.   { 
  440.    fseek($f,ftell($f)-1); 
  441.   }; 
  442.  return retbits($byte,$lastcbit,$count); 
  443. }; 
  444.  
  445.   
  446.  
  447. function rgbtohex($red,$green,$blue
  448.   { 
  449.    $hred=dechex($red);if(strlen($hred)==1) $hred="0$hred"
  450.    $hgreen=dechex($green);if(strlen($hgreen)==1) $hgreen="0$hgreen"
  451.    $hblue=dechex($blue);if(strlen($hblue)==1) $hblue="0$hblue"
  452.    return($hred.$hgreen.$hblue); 
  453.   }; 
  454.  
  455.         function int_to_dword($n
  456.         { 
  457.                 return chr($n & 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24) & 255); 
  458.         } 
  459.         function int_to_word($n
  460.         { 
  461.                 return chr($n & 255).chr(($n >> 8) & 255); 
  462.         } 
  463.  
  464.  
  465. function decbin8($d
  466. return decbinx($d,8); 
  467. }; 
  468.  
  469. function decbinx($d,$n
  470. $bin=decbin($d); 
  471. $sbin=strlen($bin); 
  472. for($j=0;$j<$n-$sbin;$j++) 
  473.  $bin="0$bin"
  474. return $bin
  475. }; 
  476.  
  477. function inttobyte($n
  478. {//开源代码phpfensi.com 
  479. return chr($n); 
  480. }; 
  481. //实例方法,代码如下: 
  482. include_once('bmp.php'); 
  483. $image=imagecreatefrombmp('a.bmp'); 
  484. imagejpeg($image,'a.jpeg'); 
  485. imagedestroy($image);  

Tags: bmp格式转换 jpg格式程序

分享到: