Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Skalowanie, ucinanie zdjęć, ratio
eai
post
Post #1





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


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 :-)

Ten post edytował eai 13.06.2007, 17:39:32
Go to the top of the page
+Quote Post
Black-Berry
post
Post #2





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

cheers.
Go to the top of the page
+Quote Post
eai
post
Post #3





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


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.

Ten post edytował eai 13.06.2007, 18:06:55
Go to the top of the page
+Quote Post
Black-Berry
post
Post #4





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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ż (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Kurde - w końcu 16 lat nauki matematyki na coś mi sie przydały (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował Black-Berry 13.06.2007, 18:05:50
Go to the top of the page
+Quote Post
Ludvik
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Ludvik 13.06.2007, 18:27:29
Go to the top of the page
+Quote Post
eai
post
Post #6





Grupa: Zarejestrowani
Postów: 367
Pomógł: 10
Dołączył: 20.05.2005

Ostrzeżenie: (0%)
-----


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 ;-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 29.09.2025 - 06:52