2012-07-04 18 views
5

Aktualnie używam GD i trochę PHP do obracania obrazów. Po każdym obrocie jakość obrazu pogarsza się. Czy istnieje lepszy sposób na zrobienie tego czy jest to oczekiwane?Obracanie obrazu PHP traci jakość po każdym obrocie

$img = new ImageClass; 
    list($original, $info) = $img->load($src); 

    // Determine angle 
    $angle = strtolower($angle); 
    if($angle == 'cw' || $angle == 'clockwise') $angle = 270; 
    if($angle == 'ccw' || $angle == 'counterclockwise') $angle = 90; 

    $rgb = $img->hex2rgb($bg_color); 
    $bg_color = imagecolorallocate($original, $rgb['r'], $rgb['g'], $rgb['b']); 

    $new = imagerotate($original, $angle, $bg_color); 

Czy można obrócić stronę klienta obrazu za pomocą jquery, a następnie zapisać obraz za pomocą PHP na serwerze? Zakładam, że to pomoże w jakości obrazu.

Odpowiedz

4

W naszej usłudze udostępniania obsługujemy to inaczej. Zachowujemy oryginalny obraz przez cały czas i przechowujemy początkowy obrót (0).

Po obróceniu oryginalny obraz jest ładowany, obracany zgodnie z obrotem +/- 90, a kopia jest zapisywana w systemie plików. Następnie baza danych jest aktualizowana o nowy obrót.

Potrzebne są jeszcze dwie kolumny w bazie danych dla miejsca obrotu i miejsca kopiowania. Zakładam również, że zawsze wykonujesz początkową zmianę rozmiaru (i być może wielokrotność dla różnych rozmiarów), aby dodatkowa kolumna zawsze wskazywała kopię zamiast wskazywać na oryginał zamiast obracać.

+0

W ten sposób działa także iPhoto. – dkamins

3

Po obróceniu obrazu w skończonej macierzy nie można uniknąć pogorszenia jakości po stronie serwera lub po stronie klienta, a te degradacje są dodawane przy każdym obrocie.

Jeśli potrzebujesz wielu obróconych obrazów tego samego, musisz zawsze użyć pierwszego (nigdy nie obróconego) obrazu jako źródła i zwiększyć kąt zamiast obracać ostatni obrócony obraz.

+0

Faktycznie, kiedy Magowie są obracani po stronie klienta poprzez JS lub CSS, przeglądarka w zasadzie robi to, co Jack opisuje w swojej odpowiedzi. Możesz więc obracać obraz tyle razy, ile chcesz, lub po prostu obracać go bez obawy o jego degradację przy każdym dodatkowym obrocie. –

+0

Można również obracać wiele razy ten sam obraz po stronie klienta ... –

+0

Jakieś sugerowane strony klienta, które robią tego typu rzeczy? – Paul

1

Za każdym razem, gdy zapiszesz plik JPG, utracisz jakość. Jest to format "stratny". Jeśli używasz PNG, możesz obracać tyle razy, ile chcesz, z zerową stratą jakości, ponieważ jest to format "bezstratny".

+1

Nie. To prawda, że ​​zapisanie w jpeg przyczynia się do utraty jakości, ale nie można obracać obrazu (z wyjątkiem pewnych rzadkich warunków) bez utraty jakości. –

1

kilka punktów

  • jak dystroy napisał, rotacja jest stratny gdy stosowany na skompresowanych obrazów
  • stronie klienta obrót nie jest zwykle manipulacja obrazu, ale obrót obiektu obrazu w widoku, więc kiedy wysłać go na serwer, będzie to obraz oryginalny
  • ImageMagick jest podobno dostarczać lepsze wyniki niż GD na przemian (patrz http://de.php.net/imagick)