php bmp size_bitmap 0,php中从bmp文件创建图像ImageCreateFromBMP

php中从bmp文件创建图像ImageCreateFromBMP

来源:互联网  宽屏版  评论

2006-01-12 18:03:30

dfab62a931c961368cf274761906a5ff.giffunction  ImageCreateFromBMP ($filename )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif if  (! $f1  = fopen ($filename ,"rb")) return  FALSE ;

dfab62a931c961368cf274761906a5ff.gif $FILE  = unpack ("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread ($f1 ,14 ));

dfab62a931c961368cf274761906a5ff.gif if  ($FILE ['file_type'] != 19778 ) return  FALSE ;

dfab62a931c961368cf274761906a5ff.gif $BMP  = unpack ('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.  '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.  '/Vvert_resolution/Vcolors_used/Vcolors_important', fread ($f1 ,40 ));

dfab62a931c961368cf274761906a5ff.gif $BMP ['colors'] = pow (2 ,$BMP ['bits_per_pixel']);

dfab62a931c961368cf274761906a5ff.gif if  ($BMP ['size_bitmap'] == 0 ) $BMP ['size_bitmap'] = $FILE ['file_size'] - $FILE ['bitmap_offset'];

dfab62a931c961368cf274761906a5ff.gif $BMP ['bytes_per_pixel'] = $BMP ['bits_per_pixel']/8 ;

dfab62a931c961368cf274761906a5ff.gif $BMP ['bytes_per_pixel2'] = ceil ($BMP ['bytes_per_pixel']);

dfab62a931c961368cf274761906a5ff.gif $BMP ['decal'] = ($BMP ['width']*$BMP ['bytes_per_pixel']/4 );

dfab62a931c961368cf274761906a5ff.gif $BMP ['decal'] -= floor ($BMP ['width']*$BMP ['bytes_per_pixel']/4 );

dfab62a931c961368cf274761906a5ff.gif $BMP ['decal'] = 4 -(4 *$BMP ['decal']);

dfab62a931c961368cf274761906a5ff.gif if  ($BMP ['decal'] == 4 ) $BMP ['decal'] = 0 ;

dfab62a931c961368cf274761906a5ff.gif $PALETTE  = array ();

dfab62a931c961368cf274761906a5ff.gif if  ($BMP ['colors'] < 16777216 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $PALETTE  = unpack ('V'. $BMP ['colors'], fread ($f1 ,$BMP ['colors']*4 ));

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif    } $IMG  = fread ($f1 ,$BMP ['size_bitmap']);

dfab62a931c961368cf274761906a5ff.gif $VIDE  = chr (0 );

dfab62a931c961368cf274761906a5ff.gif $res  = imagecreatetruecolor ($BMP ['width'],$BMP ['height']);

dfab62a931c961368cf274761906a5ff.gif $P  = 0 ;

dfab62a931c961368cf274761906a5ff.gif $Y  = $BMP ['height']-1 ;

dfab62a931c961368cf274761906a5ff.gif while  ($Y  >= 0 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $X =0 ;

dfab62a931c961368cf274761906a5ff.gif while  ($X  < $BMP ['width'])

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif if  ($BMP ['bits_per_pixel'] == 24 ) $COLOR  = unpack ("V",substr ($IMG ,$P ,3 ). $VIDE );

dfab62a931c961368cf274761906a5ff.gif elseif  ($BMP ['bits_per_pixel'] == 16 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $COLOR  = unpack ("n",substr ($IMG ,$P ,2 ));

dfab62a931c961368cf274761906a5ff.gif $COLOR [1 ] = $PALETTE [$COLOR [1 ]+1 ];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif            } elseif  ($BMP ['bits_per_pixel'] == 8 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $COLOR  = unpack ("n",$VIDE.substr ($IMG ,$P ,1 ));

dfab62a931c961368cf274761906a5ff.gif $COLOR [1 ] = $PALETTE [$COLOR [1 ]+1 ];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif            } elseif  ($BMP ['bits_per_pixel'] == 4 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $COLOR  = unpack ("n",$VIDE.substr ($IMG ,floor ($P ),1 ));

dfab62a931c961368cf274761906a5ff.gif if  (($P *2 )%2  == 0 ) $COLOR [1 ] = ($COLOR [1 ] >> 4 ) ;

dfab62a931c961368cf274761906a5ff.gif else  $COLOR [1 ] = ($COLOR [1 ] &  0x0F );

dfab62a931c961368cf274761906a5ff.gif $COLOR [1 ] = $PALETTE [$COLOR [1 ]+1 ];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif            } elseif  ($BMP ['bits_per_pixel'] == 1 )

be99e81139f8de094c1e69c836a79ecf.gif{...

dfab62a931c961368cf274761906a5ff.gif $COLOR  = unpack ("n",$VIDE.substr ($IMG ,floor ($P ),1 ));

dfab62a931c961368cf274761906a5ff.gif if  (($P *8 )%8  == 0 ) $COLOR [1 ] = $COLOR [1 ] >>7 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 1 ) $COLOR [1 ] = ($COLOR [1 ] &  0x40 )>>6 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 2 ) $COLOR [1 ] = ($COLOR [1 ] &  0x20 )>>5 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 3 ) $COLOR [1 ] = ($COLOR [1 ] &  0x10 )>>4 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 4 ) $COLOR [1 ] = ($COLOR [1 ] &  0x8 )>>3 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 5 ) $COLOR [1 ] = ($COLOR [1 ] &  0x4 )>>2 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 6 ) $COLOR [1 ] = ($COLOR [1 ] &  0x2 )>>1 ;

dfab62a931c961368cf274761906a5ff.gif elseif  (($P *8 )%8  == 7 ) $COLOR [1 ] = ($COLOR [1 ] &  0x1 );

dfab62a931c961368cf274761906a5ff.gif $COLOR [1 ] = $PALETTE [$COLOR [1 ]+1 ];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif            } else  return  FALSE ;

dfab62a931c961368cf274761906a5ff.gif imagesetpixel ($res ,$X ,$Y ,$COLOR [1 ]);

dfab62a931c961368cf274761906a5ff.gif $X ++;

dfab62a931c961368cf274761906a5ff.gif $P  += $BMP ['bytes_per_pixel'];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif        } $Y --;

dfab62a931c961368cf274761906a5ff.gif $P +=$BMP ['decal'];

dfab62a931c961368cf274761906a5ff.gif

dfab62a931c961368cf274761906a5ff.gif    } fclose ($f1 );

dfab62a931c961368cf274761906a5ff.gif return  $res ;

dfab62a931c961368cf274761906a5ff.gif}

[code]function ImageCreateFromBMP($filename)

{

if (! $f1 = fopen($filename,"rb")) return FALSE;

$FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,14));

if ($FILE['file_type'] != 19778) return FALSE;

$BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.

'/Vcompression/Vsize_bitmap/Vhoriz_resolution'.

'/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1,40));

$BMP['colors'] = pow(2,$BMP['bits_per_pixel']);

if ($BMP['size_bitmap'] == 0) $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset'];

$BMP['bytes_per_pixel'] = $BMP['bits_per_pixel']/8;

$BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']);

$BMP['decal'] = ($BMP['width']*$BMP['bytes_per_pixel']/4);

$BMP['decal'] -= floor($BMP['width']*$BMP['bytes_per_pixel']/4);

$BMP['decal'] = 4-(4*$BMP['decal']);

if ($BMP['decal'] == 4) $BMP['decal'] = 0;

$PALETTE = array();

if ($BMP['colors'] < 16777216)

{

$PALETTE = unpack('V'.$BMP['colors'], fread($f1,$BMP['colors']*4));

}

$IMG = fread($f1,$BMP['size_bitmap']);

$VIDE = chr(0);

$res = imagecreatetruecolor($BMP['width'],$BMP['height']);

$P = 0;

$Y = $BMP['height']-1;

while ($Y >= 0)

{

$X=0;

while ($X < $BMP['width'])

{

if ($BMP['bits_per_pixel'] == 24)

$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);

elseif ($BMP['bits_per_pixel'] == 16)

{

$COLOR = unpack("n",substr($IMG,$P,2));

$COLOR[1] = $PALETTE[$COLOR[1]+1];

}

elseif ($BMP['bits_per_pixel'] == 8)

{

$COLOR = unpack("n",$VIDE.substr($IMG,$P,1));

$COLOR[1] = $PALETTE[$COLOR[1]+1];

}

elseif ($BMP['bits_per_pixel'] == 4)

{

$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));

if (($P*2)%2 == 0) $COLOR[1] = ($COLOR[1] >> 4) ; else $COLOR[1] = ($COLOR[1] & 0x0F);

$COLOR[1] = $PALETTE[$COLOR[1]+1];

}

elseif ($BMP['bits_per_pixel'] == 1)

{

$COLOR = unpack("n",$VIDE.substr($IMG,floor($P),1));

if (($P*8)%8 == 0) $COLOR[1] = $COLOR[1] >>7;

elseif (($P*8)%8 == 1) $COLOR[1] = ($COLOR[1] & 0x40)>>6;

elseif (($P*8)%8 == 2) $COLOR[1] = ($COLOR[1] & 0x20)>>5;

elseif (($P*8)%8 == 3) $COLOR[1] = ($COLOR[1] & 0x10)>>4;

elseif (($P*8)%8 == 4) $COLOR[1] = ($COLOR[1] & 0x8)>>3;

elseif (($P*8)%8 == 5) $COLOR[1] = ($COLOR[1] & 0x4)>>2;

elseif (($P*8)%8 == 6) $COLOR[1] = ($COLOR[1] & 0x2)>>1;

elseif (($P*8)%8 == 7) $COLOR[1] = ($COLOR[1] & 0x1);

$COLOR[1] = $PALETTE[$COLOR[1]+1];

}

else

return FALSE;

imagesetpixel($res,$X,$Y,$COLOR[1]);

$X++;

$P += $BMP['bytes_per_pixel'];

}

$Y--;

$P+=$BMP['decal'];

}

fclose($f1);

return $res;

}[/code]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值