2009-07-29 25 views
40

Ho un sacco di file PNG di alta qualità. Voglio usare PHP per convertirli in JPG a causa delle dimensioni dei file più piccole pur mantenendo la qualità. Voglio visualizzare i file JPG sul web.Usa PHP per convertire PNG in JPG con la compressione?

Il PHP dispone di funzioni/librerie per eseguire questa operazione? La qualità/compressione è buona?

+6

Si noti che, a seconda delle immagini, JPG non avrà sempre un file di dimensioni inferiori rispetto a un file PNG, quindi assicuratevi di utilizzare quello giusto per la vostra situazione. http://lbrandy.com/blog/2008/10/my-first-and-last-webcomic/ – jimyi

risposta

56

Fare attenzione a ciò che si desidera convertire. JPG non supporta l'alfa-trasparenza mentre PNG lo fa. Perderai questa informazione.

Per convertire, è possibile utilizzare la seguente funzione:

// Quality is a number between 0 (best compression) and 100 (best quality) 
function png2jpg($originalFile, $outputFile, $quality) { 
    $image = imagecreatefrompng($originalFile); 
    imagejpeg($image, $outputFile, $quality); 
    imagedestroy($image); 
} 

Questa funzione utilizza i imagecreatefrompng() ei imagejpeg() funzioni della libreria GD.

+9

Si prega di dare un'occhiata alla risposta di danLeon per convertire PNG in JPG in modo sicuro. – Codemole

+4

Questa risposta non funziona con i file PNG con trasparenza. –

4

Si potrebbe voler esaminare Image Magick, in genere considerata la libreria standard di fatto per l'elaborazione delle immagini. Richiede però l'installazione di un modulo php aggiuntivo, non sicuro se c'è/che sono disponibili in un'installazione predefinita.

HTH.

9

Questo è un piccolo esempio che permette di convertire 'immagine.png' a 'image.jpg' al 70% la qualità delle immagini:

<?php 
$image = imagecreatefrompng('image.png'); 
imagejpeg($image, 'image.jpg', 70); 
imagedestroy($image); 
?> 

Speranza che aiuta

2

io so che non è un esatto rispondi all'OP, ma come le risposte sono già state date ...

Hai davvero bisogno di farlo in PHP?
Quello che voglio dire è: se hai bisogno di convertire un sacco di immagini, farlo in PHP potrebbe non essere il modo migliore: si ci si trova davanti a memory_limit, max_execution_time, ...

Vorrei anche dire GD potrebbe non ottenere il miglior rapporto qualità/dimensioni; ma non sono sicuro di che (se si fa un confronto tra GD e altre soluzioni, io sono molto interessato dai risultati ;-))

Un altro approccio, non utilizzando PHP, sarebbe quella di utilizzare Image Magick tramite la riga di comando (e non come un'estensione di PHP come le altre persone suggerito)

Dovresti scrivere uno script di shell che passa attraverso tutti i .png file, e li dà a uno

  • convert per creare un nuovo .jpg file per e ach .png file
  • o mogrify per lavorare direttamente sul file originale e sovrascriverlo.


Come sidenote: se si sta facendo questo direttamente sul server di produzione, si potrebbe mettere un po 'di tempo di sonno tra mazzi di conversioni, di lasciar raffreddare un po' a volte ^^


ho utilizzare lo script di shell + convert/mogrify un paio di volte (avendo correre per qualcosa come 10 ore una volta), e fanno il lavoro molto bene :-)

9
<?php 
function createThumbnail($imageDirectory, $imageName, $thumbDirectory, $thumbWidth) { 
    $explode = explode(".", $imageName); 
    $filetype = $explode[1]; 

    if ($filetype == 'jpg') { 
     $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName"); 
    } else 
    if ($filetype == 'jpeg') { 
     $srcImg = imagecreatefromjpeg("$imageDirectory/$imageName"); 
    } else 
    if ($filetype == 'png') { 
     $srcImg = imagecreatefrompng("$imageDirectory/$imageName"); 
    } else 
    if ($filetype == 'gif') { 
     $srcImg = imagecreatefromgif("$imageDirectory/$imageName"); 
    } 

    $origWidth = imagesx($srcImg); 
    $origHeight = imagesy($srcImg); 

    $ratio = $origWidth/$thumbWidth; 
    $thumbHeight = $origHeight/$ratio; 

    $thumbImg = imagecreatetruecolor($thumbWidth, $thumbHeight); 
    imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $origWidth, $origHeight); 

    if ($filetype == 'jpg') { 
     imagejpeg($thumbImg, "$thumbDirectory/$imageName"); 
    } else 
    if ($filetype == 'jpeg') { 
     imagejpeg($thumbImg, "$thumbDirectory/$imageName"); 
    } else 
    if ($filetype == 'png') { 
     imagepng($thumbImg, "$thumbDirectory/$imageName"); 
    } else 
    if ($filetype == 'gif') { 
     imagegif($thumbImg, "$thumbDirectory/$imageName"); 
    } 
} 
    ?> 

Questo è uno script molto buona miniature =) Ecco un esempio:

$ path = Il percorso della cartella in cui l'immagine originale è. $ name = Il nome del file del file di cui vuoi fare una miniatura. $ thumbpath = Il percorso della directory in cui si desidera salvare la miniatura. $ maxwidth = la larghezza massima della miniatura in PX es. 100 (che sarà 100 px).

createThumbnail($path, $name, $thumbpath, $maxwidth);

+1

Ho usato questo e ha funzionato bene, grazie! – user1053263

120

Fate questo per convertire in modo sicuro un PNG in JPG con la trasparenza in bianco.

$image = imagecreatefrompng($filePath); 
$bg = imagecreatetruecolor(imagesx($image), imagesy($image)); 
imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255)); 
imagealphablending($bg, TRUE); 
imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image)); 
imagedestroy($image); 
$quality = 50; // 0 = worst/smaller file, 100 = better/bigger file 
imagejpeg($bg, $filePath . ".jpg", $quality); 
imagedestroy($bg); 
+6

Questo è il modo più corretto per convertire PNG in JPG in modo sicuro. Voglio aggiungere una valutazione top ++ per questa risposta. – Codemole

+1

Questo è molto meglio, si occupa di trasparenza. Due risposte migliori ora sono livellate! –

+1

Questa dovrebbe essere la risposta accettata – Scalpweb

Problemi correlati