Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tworzenie miniatur o stałym rozmiarze
Forum PHP.pl > Forum > PHP
deha21
Mam skrypt galerii w którym jest tworzenie miniatur. Ale problem jest taki że przy zdjęciach które mają większe height niż width to miniatura tworzy się na szerokość dobrze ale proporcje robią swoje i miniaturka zamiast mieć np. 150x112 ma 150x330. A chciałbym żeby było 150x112 bez względu na to czy zdjęcie jest długie czy wysokie.
Mam kod, pisałem go już dawno i w sumie nie wiele z niego pamiętam winksmiley.jpg Zresztą w temacie miniaturek jestem w ogóle słaby:

  1. $arr = pathinfo($_FILES["Filedata"]["name"]);
  2. $arr['extension'] = strtolower($arr['extension']);
  3. $file=uniqid().".".$arr['extension'];
  4.  
  5. move_uploaded_file($_FILES["Filedata"]["tmp_name"], "../files/gallery/".$id."/".$file);
  6.  
  7. ini_set("memory_limit","70M");
  8.  
  9. $infoo = getimagesize("../files/gallery/".$id."/".$file);
  10.  
  11. function resize($filef, $new_width, $new_height, $thumb, $quality) {
  12. $info = getimagesize($filef);
  13. if ($info === false)
  14. return false;
  15. $img = null;
  16. switch($info[2]){
  17. case IMAGETYPE_JPEG:
  18. $img = imagecreatefromjpeg($filef);
  19. break;
  20. case IMAGETYPE_GIF:
  21. $img = imagecreatefromgif($filef);
  22. break;
  23. case IMAGETYPE_PNG:
  24. $img = imagecreatefrompng($filef);
  25. break;
  26. default:
  27. return false;
  28. }
  29. $th = imagecreatetruecolor($new_width, $new_height);
  30.  
  31.  
  32. switch($info[2]){
  33. case IMAGETYPE_JPEG:
  34. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  35. imagejpeg($th, $filef, $quality);
  36. break;
  37. case IMAGETYPE_GIF:
  38. imagealphablending($th, true);
  39. imagetruecolortopalette($img, true, 256);
  40. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  41. imagegif($th, $filef);
  42. break;
  43. case IMAGETYPE_PNG:
  44. imagealphablending($th, false);
  45. imagesavealpha($th, true);
  46. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  47. imagepng($th, $filef);
  48. break;
  49. }
  50. imagedestroy($th);
  51. imagedestroy($img);
  52. return true;
  53.  
  54. }
  55.  
  56. if ($infoo[0]>1024) {
  57. $height = (1024/$infoo[0])*$infoo[1];
  58. resize("../files/gallery/".$id."/".$file, 1024, $height, "../files/gallery/".$id."/".$file, 95);
  59. }
  60.  
  61. copy("../files/gallery/".$id."/".$file,"../files/gallery/".$id."/thumb_".$file);
  62. $thumb_height = (150/$infoo[0])*$infoo[1];
  63. resize("../files/gallery/".$id."/thumb_".$file, 150, $thumb_height, "../files/gallery/".$id."/thumb_".$file, 95);
  64.  


Aha, nie chciałbym używać gotowych skryptów czy bibliotek bo najpierw chciałbym wszystko zrozumieć a potem dopiero bawić sie w coś bardziej skomplikowanego.
Fifi209
Jakby mało było na necie tego
http://www.google.pl/search?client=firefox...Szukaj+w+Google
deha21
...wiedziałem, że trafi się taka odpowiedź.
Samo tworzenie miniatur jak widać jest zrobione i działa. Wszystkie skrypty przeznaczone do tego nie mówią o tym co ja chce zrobić. Jakbym to umiał zrobić czy bym to znalazł to bym tu nie pisał. A trochę się naszukałem.
thek
A czemu nie olewasz ratio? winksmiley.jpg Skoro i tak wielkości width oraz height mają być stałe to po co właściwie liczyć proporcję? winksmiley.jpg Ma być 200x100 to na sztywno tak przy miniaturce ustawiaj. imagecopyresampled samo z siebie "skurczy" obrazek do danych wymiarów i zniekształci na odowiedniej osi by pasowało. W ten sposób z obrazka koła stworzysz elipsę bez problemu. Sam czasem tę właściwość wykorzystuję gdy nie mam ochoty na miniaturkach rzędu 60x48 zamiaru zachowywać proporcji. A user kliknie i tak wyświetlenie oryginału bo nie będzie z lupą przy monitorze siedział smile.gif I nie obchodzi mnie wtedy czy oryginał miał 640x480 czy 480x640 biggrin.gif Kto by owo 60x48 oglądał? winksmiley.jpg
deha21
Czyli ma być coś takiego?
  1. imagecopyresampled($th, $img, 0, 0, 0, 0, 150, 150, $info[0], $info[1]);

Robi taką miniaturę ale wtedy na wysokość się kurczy. A właśnie tego chcę uniknąć.
thek
Sam mówiłeś, że ma się kurczyć z 330 do 112, bo miniaturka ma mieć z góry określone wymiary, niezależne od współczynnika proporcjonalności. Albo więc chcesz go zachować i w przypadku obrazka tę większą wartość będziesz przyjmował jako 150 i mniejszą skalował by zachować proporcje, albo ustawisz obie na określoną wartość, ale wtedy obrazek straci proporcje. Nie da się obu rzeczy jednocześnie mieć.
deha21
Nie wiem czy dobrze mnie zrozumiałeś. Chodzi o to, że wrzucając obrazek o obojętnie jakich wymiarach, ma się tworzyć miniaturka 150x150 (kwadratowa chyba będzie lepsza) ale przy tym zachowując proporcje. A jak coś się nie zmieści na niej to żeby obcinało resztę.
Coś takiego:
http://img171.imageshack.us/img171/7703/miniyz.jpg

I tak samo żeby się robiło z miniaturami gdzie H>W.
thek
Czyli Twój to przypadek nr1 opisany przeze mnie + przesunięcie w odpowiednie miejsce na obrazku wynikowym. Naprawdę sprawdź co oznaczają wszystkie parametry w funkcji imagecopyresampled ze szczególnym uwzględnieniem 3, 4, 7 i 8 a resztę robisz tylko tak, że ustawiasz większą z wartości width lub height na 150, a mniejszą według niej skalujesz.
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.