<? php
// 例子:
$path   =  ROOT  .   ' upload/2009/06/03/124401282315771. ' ;
$pathAll   =   $path   .   ' bmp ' ;
$mi   =   '' ;
$mi   =  ImageCreateFromBMP( $pathAll );
imagejpeg(
$mi ,   $path   .   ' jpg ' );

// 函数如下:
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 ;
}
?>