Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekonwertowanie jpeg na bmp 8 bit
Forum PHP.pl > Forum > PHP
Freeman555
Witam,

Zmagam się z takim problemem, mam plik w formacie jpeg, chce go przerobić na bmp z 8 bitową głębią kolorów czyli po 256 na każde RGB;
Kodzik znaleziony w internetach który przerabia na 16 bit;

  1. <?php
  2. //convert jpeg to 16 bit bmp
  3.  
  4. $jpgImageFile = '51.jpg';
  5. $newFileName = 'NEW_BMP';
  6.  
  7.  
  8. $imageSource = imagecreatefromjpeg($jpgImageFile);
  9. imagebmp($imageSource,$newFileName.".bmp");
  10.  
  11.  
  12. function imagebmp(&$im, $filename = "")
  13. {
  14. if (!$im) return false;
  15. $w = imagesx($im);
  16. $h = imagesy($im);
  17. $result = '';
  18.  
  19. if (!imageistruecolor($im)) {
  20. $tmp = imagecreatetruecolor($w, $h);
  21. imagecopy($tmp, $im, 0, 0, 0, 0, $w, $h);
  22. imagedestroy($im);
  23. $im = & $tmp;
  24. }
  25.  
  26. $biBPLine = $w * 2;
  27. $biStride = ($biBPLine + 3) & ~3;
  28. $biSizeImage = $biStride * $h;
  29. $bfOffBits = 66;
  30. $bfSize = $bfOffBits + $biSizeImage; //BITMAPFILEHEADER's size + BITMAPINFOHEADER size
  31. $result .= substr('BM', 0, 2);
  32. $result .= pack ('VvvV', $bfSize, 0, 0, $bfOffBits);
  33. $result .= pack ('VVVvvVVVVVV', 40, $w, '-'.$h, 1, 16, 3, $biSizeImage, 0, 0, 0, 0);
  34. $numpad = $biStride - $biBPLine;
  35.  
  36.  
  37. $result .= pack('VVV',63488,2016,31);
  38. for ($y = 0; $y < $h; ++$y) {
  39. for ($x = 0; $x < $w; ++$x) {
  40.  
  41. $rgb = imagecolorat($im, $x, $y);
  42. $r24 = ($rgb >> 16) & 0xFF;
  43. $g24 = ($rgb >> 8) & 0xFF;
  44. $b24 = $rgb & 0xFF;
  45. $col = ((($r24 >> 3) << 11) | (($g24 >> 2) << 5) | ($b24 >> 3));
  46. $result .= pack('v',$col);
  47. }
  48. for ($i = 0; $i < $numpad; ++$i)
  49. $result .= pack ('C', 0);
  50. }
  51. if($filename==""){
  52. }
  53. else
  54. {
  55. $file = fopen($filename, "wb");
  56. fwrite($file, $result);
  57. fclose($file);
  58. }
  59. return true;
  60. }
  61. ?>


Na głównej stronie projektu PHP w pierwszym komentarzu jest kod na przeróbkę dla bmp 24 bit;
http://lv.php.net/manual/en/ref.image.php#63689

Zwraca się z prośbą o pomoc w przeróbce na 8 bitów.
trueblue
Musiałbyś zaimplementować jakąś metodę mapowania palety 24-bitowej na indeksowaną.
Np. zliczyć wszystkie kolory, posortować względem częstotliwości występowania i dla tych powyżej indeksu 255 znaleźć najbliższy odpowiednik z tych najczęstszych (tu można wykorzystać obliczenie długości wektora 3D (przestrzenią są R/G/B) - najkrótszy wektor pomiędzy punktami wskazuje najbliższy kolor).

Ale.
Nie prościej przekonwertować na gif i z gifa na bmp?
maly_swd
Ja bym użył tego:
http://php.net/manual/en/function.imagetru...ortopalette.php

A później to już pestka zapisać to jako RAW BMP.
Freeman555
Dziękuję za podpowiedzi, mam nadzieję że to co zrobiłem jest w pełni odpowiedzią na moje pytanie, otóż:

Skorzystałem z biblioteki imagick (http://www.imagemagick.org/script/index.php) bo biblioteka GD (http://php.net/manual/en/book.image.php) nie obsługuje formatu BMP, tylko WBMP, a to coś innego.

Wywołanie napisałem tak;
  1. <?php
  2. //convert jpeg to 8 bit bmp with imagick library
  3.  
  4. //Read the image
  5. $im = new imagick( 'a.jpg' );
  6.  
  7. // Set number of colors
  8. $numberColors = 256;
  9.  
  10. // Set colorspace
  11. $colorSpace = Imagick::COLORSPACE_SRGB;
  12.  
  13. // Set tree depth
  14. $treeDepth = 0;
  15.  
  16. // Set dither
  17. $dither = false;
  18.  
  19. // Set quantize
  20. $im->quantizeImage($numberColors, $colorSpace, $treeDepth, $dither, false);
  21.  
  22. // write to disk
  23. $im->writeImage( 'output_2.bmp' );
  24. ?>


To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.