php将bmp格式图片转换成jpg格式程序
发布时间:2022-06-17 08:41:15 所属栏目: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=""; }; }; 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); }; /* * helping functions: *------------------------- * * freadbyte($file) - reads 1 byte from $file * freadword($file) - reads 2 bytes (1 word) from $file * freaddword($file) - reads 4 bytes (1 dword) from $file * freadlngint($file) - same as freaddword($file) * decbin8($d) - returns binary string of d zero filled to 8 * retbits($byte,$start,$len) - returns bits $start->$start+$len from $byte * freadbits($file,$count) - reads next $count bits from $file * rgbtohex($r,$g,$b) - convert $r, $g, $b to hex * int_to_dword($n) - returns 4 byte representation of $n * int_to_word($n) - returns 2 byte representation of $n */ function freadbyte($f) { return ord(fread($f,1)); }; function freadword($f) { $b1=freadbyte($f); $b2=freadbyte($f); return $b2*256+$b1; }; function freadlngint($f) { return freaddword($f); }; function freaddword($f) { $b1=freadword($f); $b2=freadword($f); return $b2*65536+$b1; }; function retbits($byte,$start,$len) { $bin=decbin8($byte); $r=bindec(substr($bin,$start,$len)); return $r; }; $currentbit=0; function freadbits($f,$count) { global $currentbit,$smode; $byte=freadbyte($f); $lastcbit=$currentbit; $currentbit+=$count; if($currentbit==8) { $currentbit=0; } else { fseek($f,ftell($f)-1); }; return retbits($byte,$lastcbit,$count); }; function rgbtohex($red,$green,$blue) { $hred=dechex($red);if(strlen($hred)==1) $hred="0$hred"; $hgreen=dechex($green);if(strlen($hgreen)==1) $hgreen="0$hgreen"; $hblue=dechex($blue);if(strlen($hblue)==1) $hblue="0$hblue"; return($hred.$hgreen.$hblue); }; function int_to_dword($n) { return chr($n & 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24) & 255); } function int_to_word($n) { return chr($n & 255).chr(($n >> 8) & 255); } function decbin8($d) { return decbinx($d,8); }; function decbinx($d,$n) { $bin=decbin($d); $sbin=strlen($bin); for($j=0;$j<$n-$sbin;$j++) $bin="0$bin"; return $bin; }; function inttobyte($n) {//开源代码phpfensi.com return chr($n); }; //实例方法,代码如下: include_once('bmp.php'); $image=imagecreatefrombmp('a.bmp'); imagejpeg($image,'a.jpeg'); imagedestroy($image); (编辑:鹤壁站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |