Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skalowanie, ucinanie zdjęć
Forum PHP.pl > Forum > PHP
eai
Potrzebuje kilka wzorów na obliczanie szerokości i wysokości obrazu.

1. Obliczanie ratio zdjęcia po podaniu wysokości i szerokości zdjęcia
2. Mam zdefiniowane ratio, podaną wysokość i szerokość zdjęcia.
Chcę uciąć zdjęcie jeśli ratio zdjęcia jest inne niż zdefiniowane ratio
a) Ucinam wysokość, szerokość zostaje taka sama, tak żeby ratio zgadzało się ze zdefiniowanym ratio
B) Ucinam szerokość, wysokość zostaje taka sama, tak żeby ratio zgadzało się ze zdefiniowanym ratio
c) Ucinam szerokość i wysokość, tak żeby ratio zgadzało się ze zdefiniowanym ratio

Pomocy :-)
Black-Berry
To zbyt złożone zdania żebym je mógł przetworzyć. Ale moze wystarczy jak dam Ci radę. Narysuj to sobie na kartce a wszystko stanie się jasne. A jak nie to użyj układu równań. Mi pomogło kiedy robiłem skalowanie i ucinanie. winksmiley.jpg

cheers.
eai
OK. Pierwsze mam. Trzeba obliczyć najmniejszy wspólny dzielnik i podzielić te liczby. Algorytm Euklidesa.
  1. <?php
  2.  
  3. function  get_ratio ($x, $y)
  4. {
  5.  $img_x = $x;
  6.  $img_y = $y;
  7.  
  8.  $c = 0;
  9.  while($y <> 0)
  10.  {
  11. $c = $y;
  12. $y = $x % $y;
  13. $x = $c;
  14.  }
  15.  
  16.  $nwd = $x;
  17.  
  18.  return 'Ratio: ' . ($img_x/$nwd) . ':' . ($img_y/$nwd);
  19. }
  20.  
  21. echo '800x600 ' . get_ratio (800, 600) . '<br />';
  22. echo '1024x768 '. get_ratio (1024, 768) . '<br />';
  23. echo '560x228 '. get_ratio (560, 228) . '<br />';
  24.  
  25. ?>

Kod
800x600 Ratio: 4:3
1024x768 Ratio: 4:3
560x228 Ratio: 140:57

Ale z resztą pomóżcie.
Black-Berry
1c) dane ratio np: 4x-3y. wysokosc i szerokosc np 100x 100y. Calosc sklada sie z 4 czesci (bo wieksza liczba ratio to 4) teraz wiem ze 4z 4 to 100% wiec 100x nie musze skracac. 3/4 to 75% wiec szerokosc ucinam 100y=>3/4*100y=3/4*100y smile.gif

Kod
if (x.ratio > y.ratio){
    x=x;
}else{
    x= x.ratio/y.ratio*x;
}

if (y.ratio > x.ratio){
    y=y;
}else{
    y= y.ratio/x.ratio*y;
}

I tak bedziesz musiał to przeanalizować ale moze Cie to naprowadzi chociaż smile.gif Kurde - w końcu 16 lat nauki matematyki na coś mi sie przydały biggrin.gif

Właśnie się zorientowałem ze w zadaniu jest "ucinam" a nie zmniejszam. Znając docelową szerość mozesz teraz łatwo odciąć boki:

ucięciepolewej = (stary.x - nowy.x) /2;
ucieciepoprawej = ucieciepolewej.
Ludvik
Ale ratio to przecież zwykły ułamek... Więc jak najbardziej:
x/y = ratio => x = y*ratio i y = x/ratio
Jeżeli ratio obrazka jest większe od oczekiwanego, to znaczy, że jest za szeroki. Jeżeli mniejsze, to za wysoki. Obliczasz szerokość/wysokość z podanych wyrażeń. Jak chcesz uciąć kawałek ze środka, to robisz to tak jak napisał Black-Berry. Szerokość starego minus szerokość nowego i to dzielone przez 2. Tyle musisz obciąć z lewej i z prawej.

A jeżeli chcesz być w 100% dokładny (w końcu na liczbach naturalnych operujemy...), to mój pomysł na algorytm przycinania jest taki:

Porównujesz ratio z oczekiwanym. Jeżeli jest większe to:

Sprawdzasz, czy wysokość obrazka dzieli się przez mianownik ratio. Jeżeli tak, to zostawiasz ją w spokoju i ucinasz tylko na szerokość. Jeżeli nie, to liczysz nową wysokość (stara wysokość - (stara wysokość modulo mianownik ratio). Na podstawie nowej wysokości i oczekiwanego ratio liczysz szerokość.

Jeżeli ratio jest mniejsze, to na odwrót (zamieniasz wysokość z szerokością i mianownik z licznikiem). Do wszystkiego pasują te wzory, które podałem.
eai
Dzięki wielkie za wskazówki
  1. <?php
  2.  
  3. function get_ratio ($x, $y)
  4. {
  5.  $img_x = $x;
  6.  $img_y = $y;
  7.  while($y <> 0)
  8.  {
  9. $c = $y;
  10. $y = $x % $y;
  11. $x = $c;
  12.  }
  13.  
  14.  $nwd = $x;
  15.  return ($img_x/$nwd) /($img_y/$nwd);
  16. }
  17.  
  18. function cut_image ($new_ratio, $img_x, $img_y)
  19. {
  20. $old_ratio = get_ratio ($img_x, $img_y);
  21.  
  22. if($old_ratio > $new_ratio)
  23. {
  24.  $img_x = $img_y * $new_ratio;
  25. }
  26.  
  27. else
  28. {
  29.  $img_y = $img_x / $new_ratio;
  30. }
  31.  
  32. return array('x' => $img_x, 'y' => $img_y);
  33. }
  34.  
  35. $new_ratio = 4/3;
  36.  
  37. echo '800x600: ' . implode('x', cut_image ($new_ratio, 800, 600)) . '<br />';
  38. echo '1024x768: '. implode('x', cut_image ($new_ratio, 1024, 768)) . '<br />';
  39. echo '560x228: '. implode('x', cut_image ($new_ratio, 560, 228)) . '<br />';
  40.  
  41. ?>


It Work's ;-)
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.