2010-10-29 18 views
6

Yo uso imagecreatefromjpeg, imagecreatefromgif y imagecreatefrompng funciones para crear miniaturas de image/jpeg, image/gif y image/png mimos.¿Cómo crear una miniatura del archivo .BMP?

También me gustaría crear miniaturas de .BMP archivos.

Revisé un archivo y descubrí que su mímica es image/x-ms-bmp.

Sin embargo, no puedo encontrar una función imagecreatefrom... adecuada.

Sugerido.

+0

Sí, eche un vistazo a esta página de PHP - hay muchas soluciones ofrecidas: http://us.php.net/manual/en/function.imagecreatefromwbmp.php – leepowers

+0

¡Muchas gracias! –

Respuesta

11

PHP no han incorporado en las funciones de imagen de BMP.

Ha habido algunos intentos de crear funciones para hacer esto.

Puede encontrar una versión robusta y bien documentado en este comentario en la documentación de PHP: http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214

Aquí es la función de ese comentario sin la excelente documentación que hace mucho más tiempo, pero mucho más fácil de leer:

public function imagecreatefrombmp($p_sFile) 
{ 
    $file = fopen($p_sFile,"rb"); 
    $read = fread($file,10); 
    while(!feof($file)&&($read<>"")) 
     $read .= fread($file,1024); 
    $temp = unpack("H*",$read); 
    $hex = $temp[1]; 
    $header = substr($hex,0,108); 
    if (substr($header,0,4)=="424d") 
    { 
     $header_parts = str_split($header,2); 
     $width   = hexdec($header_parts[19].$header_parts[18]); 
     $height   = hexdec($header_parts[23].$header_parts[22]); 
     unset($header_parts); 
    } 
    $x    = 0; 
    $y    = 1; 
    $image   = imagecreatetruecolor($width,$height); 
    $body   = substr($hex,108); 
    $body_size  = (strlen($body)/2); 
    $header_size = ($width*$height); 
    $usePadding  = ($body_size>($header_size*3)+4); 
    for ($i=0;$i<$body_size;$i+=3) 
    { 
     if ($x>=$width) 
     { 
      if ($usePadding) 
       $i += $width%4; 
      $x = 0; 
      $y++; 
      if ($y>$height) 
       break; 
     } 
     $i_pos = $i*2; 
     $r  = hexdec($body[$i_pos+4].$body[$i_pos+5]); 
     $g  = hexdec($body[$i_pos+2].$body[$i_pos+3]); 
     $b  = hexdec($body[$i_pos].$body[$i_pos+1]); 
     $color = imagecolorallocate($image,$r,$g,$b); 
     imagesetpixel($image,$x,$height-$y,$color); 
     $x++; 
    } 
    unset($body); 
    return $image; 
} 
+0

¡Genial! ¡¡Muchas gracias!! –

+2

No funciona con x-ms-bmp, 'Aviso: Offset de cadena no inicializada' que produce imágenes distorsionadas – Sem

Cuestiones relacionadas