Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]kadrowanie od srodka
Forum PHP.pl > Forum > Przedszkole
omxd
Witam,
zmontowalem sobie skrypcik ktory pomniejsza zdjecie a nastepnie wycina z niej kwadrat o okreslonych wymiarach.Teraz moje pytanko jak sprawic alby wycinany kwadrat wysrodkowac tzn znalezc jego srodek i od srodka wyciac np.kwadrat 90x90.Prosze o rade.

  1. $src1 = $nazwamy;
  2. if(eregi('.gif',$src1)) {
  3. $imagesiz = imagecreatefromgif($src1);
  4. }
  5. elseif(eregi('.jpeg',$src1)||eregi('.jpg',$src1)) {
  6. $imagesiz = imagecreatefromjpeg($src1);
  7. }
  8. elseif(eregi('.png',$src1)) {
  9. $imagesiz = imagecreatefrompng($src1);
  10. }
  11. else {
  12. exit("kwadrat");
  13. }
  14.  
  15.  
  16.  
  17.  
  18. $x = imagesx($imagesiz);
  19. $y = imagesy($imagesiz);
  20. if($x>=$y){
  21. $height=90;
  22. $proporcja = $height /$y;
  23. $obrazekszerokosc = $x * $proporcja;
  24. $obrazekwysokosc = $y * $proporcja;
  25. } else{
  26. $width=90;
  27. $proporcja = $width /$x;
  28. $obrazekszerokosc = $x * $proporcja;
  29. $obrazekwysokosc = $y * $proporcja;
  30. }
  31.  
  32. $mini = imagecreatetruecolor($obrazekszerokosc,$obrazekwysokosc);
  33. imagecopyresampled($mini, $imagesiz, 0, 0, 0, 0, $obrazekszerokosc, $obrazekwysokosc, imagesx($imagesiz), imagesy($imagesiz));
  34.  
  35. if(eregi('.gif',$src1)) {
  36. imagegif($mini, "$liczba2.gif", 70);
  37. $imagekwadrat = "$liczba2.gif";
  38. }
  39. elseif(eregi('.jpeg',$src1)||eregi('.jpg',$src1)) {
  40. imagejpeg($mini, "$liczba2.jpg", 70);
  41. $imagekwadrat = "$liczba2.jpg";
  42. }
  43. elseif(eregi('.png',$src1)) {
  44. imagepng($mini, "$liczba2.png", 70);
  45. $imagekwadrat = "$liczba2.png";
  46. }
  47. else {
  48. exit("kwadrat");
  49. }
  50.  
  51. $filename= $imagekwadrat;
  52.  
  53.  
  54.  
  55. $liczb= rand(1,9999);
  56.  
  57.  
  58. list($current_width, $current_height) = getimagesize($filename);
  59.  
  60.  
  61. $left = 0;
  62. $top = 0;
  63.  
  64. $crop_width =75;
  65. $crop_height = 75;
  66.  
  67.  
  68. $canvas = imagecreatetruecolor($crop_width, $crop_height);
  69. $current_image = imagecreatefromjpeg($filename);
  70. imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
  71.  
  72.  
  73. if(eregi('.gif',$src1)) {
  74. imagejpeg($canvas, "$liczba3.gif", 100);
  75. $kwadracik="$liczba3.gif";
  76. }
  77. elseif(eregi('.jpeg',$src)||eregi('.jpg',$src1)) {
  78. imagejpeg($canvas, "$liczba3.jpg", 100);
  79. $kwadracik ="$liczba3.jpg";
  80. }
  81. elseif(eregi('.png',$src1)) {
  82. imagejpeg($canvas, "$liczba3.jpg", 100);
  83. $kwadracik ="$liczba3.gif";
  84. }
  85. else {
  86. exit("kwadracik");
  87. }
  88. imagedestroy($canvas);
  89. imagedestroy($current_image);
thek
Ja osobiście to wyszedłbym od takiej strony (i tę metodę też już poruszałem tu na forum): Najpierw skalujemy całość obrazka tak, by zachowując proporcje osiągnąć stan, gdy jeden z boków pokrywa się z oczekiwanym rozmiarem, a drugi jest większy lub równy oczekiwanemu. Dopiero wtedy obliczamy różnicę, którą potem używamy do skadrowania. Przykładu nie rzucam bo było by tego trochę w opisie krok po kroku. Na forum jednak jest na bank ten temat z moimi objaśnieniami szerszymi.
Najprościej jednak omówiwszy przykład to będzie tak:
Przy obliczaniu proporcji widzę, że przy przeskalowaniu dopasuje mi się szerokość a przeskalowanemu obrazkowi wysokość wyskoczy 20px większa niż to co chcę. Więc skaluje obraz wycinając z niego obrazek przesunięty w dół od lewego górnego rogu o połówkę różnicy między tym jaki chcemy a przeskalowaną wysokością.
bolverk
Przyjmując że height i width to wysokość i szerokość wygenerowanego obrazka i chcesz mieć wyśrodkowany obrazek o wysokości i szerokości 90 pikseli (i hipotetycznie zaczynając od lewego górnego rogu jako od początku rozmiarów zdjęcia) to wzory brzmia tak:

Kod
height/2 - 90/2;
width/2 - 90/2;


Należy pewnie zmodyfikować wzory jeśli początek obrazka jest w lewym dolnym rogu smile.gif ale to już należy do ciebie aby to przetestować bo nie będę tu nic podpowiadać smile.gif
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.