bmp 像素点 php,PHP支持BMP图像函数

在php里的库对bmp格式的图像是不支持的。PHP对于gif、jpg、png等图像文件都有ImageCreateFromGIF、imagecreatefromjpeg和ImageCreateFromPNG这些函数支持,下面这个函数就是用于实现类似这些函数的功能的。

function ImageCreateFromBMP( $filename ) {

// Ouverture du fichier en mode binaire

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

// 1 : Chargement des ent?tes FICHIER

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

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

// 2 : Chargement des ent?tes BMP

$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 ;

// 3 : Chargement des couleurs de la palette

$PALETTE = array ();

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

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

}

// 4 : Cr?ation de l'image

$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'];

}

// Fermeture du fichier

fclose ( $f1 );

return $res ;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值