2012-07-04 20 views
5

Attualmente sto usando GD e alcuni PHP per ruotare le immagini. Dopo ogni rotazione la qualità dell'immagine peggiora. C'è un modo migliore per farlo o è previsto?L'immagine di PHP gira la qualità dopo ogni rotazione

$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); 

È possibile ruotare l'immagine lato client con forse jquery e quindi salvare l'immagine tramite PHP sul server? Suppongo che questo aiuterà con la qualità dell'immagine.

risposta

4

Nel nostro servizio di condivisione gestiamo questo in modo diverso. Manteniamo l'immagine originale sempre e memorizziamo la rotazione iniziale (0).

Dopo la rotazione, l'immagine originale viene caricata, ruotata in base alla rotazione +/- 90 e una copia viene scritta sul file system. Successivamente il database viene aggiornato con la nuova rotazione.

Nel database saranno necessarie altre due colonne per la rotazione e la posizione di copia ruotata. Suppongo anche che tu faccia sempre un ridimensionamento iniziale (e forse multiplo per dimensioni diverse), in modo che la colonna in più punti sempre verso la copia anziché puntare all'originale anziché ruotarla.

+0

Questo è anche il modo in cui iPhoto funziona. – dkamins

3

Se si ruota un'immagine in una matrice finita, non è possibile evitare il degrado della qualità, lato server o lato client e tali degradazioni vengono aggiunte a ogni rotazione.

Se sono necessarie molte immagini ruotate dalla stessa, è necessario utilizzare sempre la prima immagine (mai ruotata) come sorgente e aumentare l'angolo anziché ruotare l'ultima immagine ruotata.

+0

in realtà, quando ho i maghi vengono ruotati lato client tramite JS o CSS, il browser fa fondamentalmente ciò che Jack descrive nella sua risposta. In questo modo è possibile ruotare nuovamente l'immagine tutte le volte che vuoi o semplicemente farla girare continuamente senza preoccuparsi di degradarla con ogni rotazione aggiuntiva. –

+0

È anche possibile ruotare più volte lo stesso lato client dell'immagine ... –

+0

Qualsiasi scrpt lato client suggerito che faccia questo genere di cose? – Paul

1

Ogni volta che si salva un JPG, si perderà la qualità. È un formato "in perdita". Se usi PNG, puoi ruotare tutte le volte che vuoi con una perdita di qualità pari a zero, perché è un formato "senza perdita di dati".

+1

No. È vero che il salvataggio su jpeg aggiunge alla perdita di qualità ma non è possibile ruotare un'immagine (tranne in alcune rare condizioni) senza perdita di qualità. –

1

alcuni punti

  • come dystroy ha scritto, la rotazione è lossy quando viene utilizzato su immagini compresse
  • rotazione lato client di solito non è una manipolazione delle immagini, ma una rotazione dell'oggetto dell'immagine nella vista, in modo che quando si inviarlo al server, sarà l'immagine originale
  • ImageMagick si dice di fornire risultati migliori rispetto GD sulle trasformazioni (vedi http://de.php.net/imagick)
Problemi correlati