2010-10-29 12 views
6

Używam funkcji imagecreatefromjpeg, i imagecreatefrompng do tworzenia miniatur mimów image/jpeg, image/gif i image/png.Jak utworzyć miniaturkę pliku .BMP?

Chciałbym również stworzyć miniatury plików .BMP.

Sprawdziłem jeden plik i okazało się, że jego mime to image/x-ms-bmp.

Jednak nie mogę znaleźć odpowiedniej funkcji imagecreatefrom....

Proszę sugerować.

+0

Tak, spójrz na tę stronę podręcznika PHP - dostępnych jest wiele rozwiązań: http://us.php.net/manual/en/function.imagecreatefromwbmp.php – leepowers

+0

Wielkie dzięki! –

Odpowiedz

11

PHP nie posiada wbudowanych funkcji graficznych dla BMP.

Było kilka prób utworzenia funkcji, aby to zrobić.

można znaleźć solidnego i dobrze udokumentowanego wersję w tym komentarzu w dokumentacji PHP: http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214

Oto funkcja z tego komentarza bez doskonałej dokumentacji, która sprawia, że ​​znacznie dłużej, ale o wiele bardziej czytelny:

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

Świetnie! Wielkie dzięki!! –

+2

Nie działa z x-ms-bmp, 'Uwaga: niezainicjalizowane ciągi znaków' powodujące zniekształcone obrazy – Sem