Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tworzenie miniaturek PNG z obrazków JPG bez zapisywania
Forum PHP.pl > Forum > Przedszkole
Tadek888
Mam tutaj działający kod który tworzy miniaturkę z obrazka jpg bez jej zapisywania - htaccess: RewriteRule ^obrazki/([^-]+)/([^-]+)$ imgs.php?size=$1&id=$2 [L]
  1. <?PHP // kod działa idealnie
  2. header("Content-type: image/jpeg");
  3.  
  4. $file = $_GET['id'];
  5. $dir = 'imgs/';
  6. $n_size = $_GET['size'];
  7.  
  8. function pic_res($file, $dir){
  9. $temp_res_tmp = getimagesize($dir.$file);
  10. return $temp_res_tmp;
  11. }
  12.  
  13. function photo_resize_without_saving($file, $dir, $n_size){
  14. $pic_res = pic_res($file, $dir);
  15. $pic_w = $pic_res[0]; $pic_h = $pic_res[1];
  16.  
  17. if(($pic_w > $pic_h)&&($pic_w > $n_size)){ //poziome
  18. $pic_wn = $n_size;
  19. $divisor = ($pic_w/$pic_wn);
  20. $pic_hn = round($pic_h/$divisor);
  21. }
  22. elseif(($pic_w < $pic_h)&&($pic_h > $n_size)){ //pionowe
  23. $pic_hn = $n_size;
  24. $divisor = ($pic_h/$pic_hn);
  25. $pic_wn = round($pic_w/$divisor);
  26. }
  27. else{ // jesli mniejszy niż 800px
  28. $pic_wn = $pic_w;
  29. $pic_hn = $pic_h;
  30. }
  31.  
  32. $pic = imagecreatefromjpeg($dir.$file);
  33. $new_size = imagecreatetruecolor($pic_wn, $pic_hn);
  34. imagecopyresampled($new_size, $pic, 0, 0, 0, 0, $pic_wn, $pic_hn, imagesx($pic), imagesy($pic));
  35. $save = NULL;
  36. $new_photo = imagejpeg($new_size, $save, 100);
  37. return $new_photo;
  38. }
  39.  
  40. echo photo_resize_without_saving($file, $dir, $n_size);
  41. ?>


teraz kolejna sprawa chciałbym tworzyć przezroczysty obrazek png na zasadzie
rozmiar jest stały $full = array('383','174'); width/height
na przezroczystym obrazku png tworzę miniaturkę jpg (nie poobcinaną - całość widoczna), która jest idealnie wycentrowana. Z centrowaniem sobie poradzę ale lipa wychodzi jeśli chcę zmienić jej wymiary - imagecopyresampled dla jpg

znalazłem coś takiego:
  1. $dest = imagecreatefrompng('mapCanvas.png');
  2. $src = imagecreatefromjpeg('si.jpg');
  3. imagealphablending($dest, false);
  4. imagesavealpha($dest, true);
  5.  
  6. imagecopymerge($dest, $src, 17, 13, 0, 0, 60, 100, 100);
  7.  
  8. header('Content-Type: image/png');
  9. imagepng($dest);
  10.  
  11. imagedestroy($dest);
  12. imagedestroy($src);
  13.  


więc przerobiłem na:
  1.  
  2. header('Content-Type: image/png');
  3.  
  4. $file = $_GET['id'];
  5. $dir = 'imgs/';
  6. $full = array('383','174');
  7. $max = array('363','154');
  8.  
  9. function pic_res($file, $dir){
  10. $temp_res_tmp = getimagesize($dir.$file);
  11. return $temp_res_tmp;
  12. }
  13.  
  14. function new_png($dir, $file, $max, $full){
  15. $pic_res = pic_res($file, $dir);
  16. $pic_w = $pic_res[0]; $pic_h = $pic_res[1];
  17.  
  18. if($pic_w > $pic_h){ //poziome
  19. $pic_wn = $max[0];
  20. $divisor = ($pic_w/$pic_wn);
  21. $pic_hn = round($pic_h/$divisor);
  22. }
  23. elseif($pic_w < $pic_h){ //pionowe
  24. $pic_hn = $max[1];
  25. $divisor = ($pic_h/$pic_hn);
  26. $pic_wn = round($pic_w/$divisor);
  27. }
  28.  
  29. $dest = imagecreatefrompng('map.png');
  30. $src = imagecreatefromjpeg($dir.$file);
  31. //$new_size = imagecreatetruecolor($pic_wn, $pic_hn);
  32. //imagecopyresampled($new_size, $src, 0, 0, 0, 0, $pic_wn, $pic_hn, imagesx($pic), imagesy($pic));
  33.  
  34. imagealphablending($dest, false);
  35. imagesavealpha($dest, true);
  36. imagecopymerge($dest, $src, 17, 13, 0, 0, 60, 100, 100);
  37. imagepng($dest);
  38. imagedestroy($dest);
  39. imagedestroy($src);
  40. }
  41.  
  42. echo new_png($dir, $file, $max, $full);


Ktoś pomoże ?
thek
Czy aby nie chodzi Ci o coś w stylu...
Wybieramy większy z boków jpg. Liczymy stosunek tego boku względem analogicznego w png. Jesli okazuje się, że jpg jest większy od png, skalujemy go zgodnie z wyliczonym ratio i centrujemy na png. Jeśli mniejszy, po prostu centrujemy smile.gif Tak więc jedyna róznica to fakt że raz użyjemy przed zapisem na png owego jpg ze skalowaniem, a raz nie. Podaję tylko tyle bo, jak sam napisałeś, z centrowaniem sobie poradzisz smile.gif
Tadek888
Tak tylko że jeśli chcę przesamplować JPG przy towrzeniu PNG to albo wyskakuje błąd albo sam JPG.
Rozwiązanie na samym dole działa ale pokazuje mi tylko urywek mojego JPG.

  1. function new_png($dir, $file, $max, $full){
  2. $pic_res = pic_res($file, $dir);
  3. $pic_w = $pic_res[0]; $pic_h = $pic_res[1];
  4.  
  5. if($pic_w > $pic_h){ //poziome
  6. $pic_wn = $max[0];
  7. $divisor = ($pic_w/$pic_wn);
  8. $pic_hn = round($pic_h/$divisor);
  9. }
  10. elseif($pic_w < $pic_h){ //pionowe
  11. $pic_hn = $max[1];
  12. $divisor = ($pic_h/$pic_hn);
  13. $pic_wn = round($pic_w/$divisor);
  14. }
  15.  
  16. $dest = imagecreatefrompng('map.png');
  17. $src = imagecreatefromjpeg($dir.$file);
  18. //$new_size = imagecreatetruecolor($pic_wn, $pic_hn);
  19. //imagecopyresampled($new_size, $src, 0, 0, 0, 0, $pic_wn, $pic_hn, imagesx($pic), imagesy($pic));
  20.  
  21. imagealphablending($dest, false);
  22. imagesavealpha($dest, true);
  23. imagecopymerge($dest, $src, 17, 13, 0, 0, 60, 100, 100);
  24. imagepng($dest);
  25. imagedestroy($dest);
  26. imagedestroy($src);
  27. }

jeśli zastąpie
  1. $src = imagecreatefromjpeg($dir.$file);


na:
  1. $src = imagecreatefromjpeg(DOMENA.'obrazki/200/'.$file);

w sensie jak użyję skryptu na samej górze do przerabiania JPG to też wyskakuje błąd
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.