imagecreatefrombmp() + imagebmp() 搞定bmp缩略图

//bmp
 class BMP
 {
     public static function imagebmp(&$img, $filename = false)
     {
       return imagebmp($img, $filename);
     }

     public static function imagecreatefrombmp($filename)
     {
       return imagecreatefrombmp($filename);
     }
 }

function imagebmp(&$img, $filename = false)
 {
   $wid = imagesx($img);
   $hei = imagesy($img);
   $wid_pad = str_pad(”, $wid % 4, “\0″);

   $size = 54 + ($wid + $wid_pad) * $hei;

   //prepare & save header
   $header['identifier']        = ‘BM’;
   $header['file_size']        = dword($size);
   $header['reserved']            = dword(0);
   $header['bitmap_data']        = dword(54);
   $header['header_size']        = dword(40);
   $header['width']            = dword($wid);
   $header['height']            = dword($hei);
   $header['planes']            = word(1);
   $header['bits_per_pixel']    = word(24);
   $header['compression']        = dword(0);
   $header['data_size']        = dword(0);
   $header['h_resolution']        = dword(0);
   $header['v_resolution']        = dword(0);
   $header['colors']            = dword(0);
   $header['important_colors']    = dword(0);

  if ($filename)
  {
     $f = fopen($filename, “wb”);
     foreach ($header AS $h)
     {
       fwrite($f, $h);
     }

     //save pixels
     for ($y=$hei-1; $y>=0; $y–)
     {
       for ($x=0; $x<$wid; $x++)
       {
         $rgb = imagecolorat($img, $x, $y);
         fwrite($f, byte3($rgb));
       }
       fwrite($f, $wid_pad);
     }
   fclose($f);
 }
 else
 {
   foreach ($header AS $h)
   {
      echo $h;
   }

//save pixels
 for ($y=$hei-1; $y>=0; $y–)
 {
 for ($x=0; $x<$wid; $x++)
 {
 $rgb = imagecolorat($img, $x, $y);
 echo byte3($rgb);
 }
 echo $wid_pad;
 }
 }
 }

function imagecreatefrombmp($filename)
 {
 $f = fopen($filename, “rb”);

//read header
 $header = fread($f, 54);
 $header = unpack(    ‘c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/’ .
 ‘Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/’.
 ‘Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors’, $header);

if ($header['identifier1'] != 66 or $header['identifier2'] != 77)
 {
 die(‘Not a valid bmp file’);
 }

if ($header['bits_per_pixel'] != 24)
 {
 die(‘Only 24bit BMP images are supported’);
 }

$wid2 = ceil((3*$header['width']) / 4) * 4;

$wid = $header['width'];
 $hei = $header['height'];

$img = imagecreatetruecolor($header['width'], $header['height']);

//read pixels
 for ($y=$hei-1; $y>=0; $y–)
 {
 $row = fread($f, $wid2);
 $pixels = str_split($row, 3);
 for ($x=0; $x<$wid; $x++)
 {
 imagesetpixel($img, $x, $y, dwordize($pixels[$x]));
 }
 }
 fclose($f);

return $img;
 }

function dwordize($str)
 {
 $a = ord($str[0]);
 $b = ord($str[1]);
 $c = ord($str[2]);
 return $c*256*256 + $b*256 + $a;
 }

function byte3($n)
 {
 return chr($n & 255) . chr(($n >> 8 ) & 255) . chr(($n >> 16) & 255);
 }
 function dword($n)
 {
 return pack(“V”, $n);
 }
 function word($n)
 {
 return pack(“v”, $n);
 }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值