web-dev-qa-db-fra.com

Utilisez PHP pour convertir PNG en JPG avec compression?

J'ai un tas de fichiers PNG de haute qualité. Je veux utiliser PHP pour les convertir en JPG en raison de sa taille de fichier plus petite tout en maintenant la qualité. Je veux afficher les fichiers JPG sur le Web.

PHP a-t-il des fonctions/bibliothèques pour le faire? La qualité/compression est-elle bonne?

48
John

Faites cela pour convertir en toute sécurité un PNG en JPG avec la transparence en blanc.

$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);
165
Daniel De León

Faites attention à ce que vous voulez convertir. JPG ne prend pas en charge la transparence alpha, contrairement à PNG. Vous perdrez cette information.

Pour convertir, vous pouvez utiliser la fonction suivante:

// 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);
}

Cette fonction utilise les fonctions imagecreatefrompng() et imagejpeg() de la bibliothèque Gd.

58
Andrew Moore

Voici un petit exemple qui convertira 'image.png' en 'image.jpg' avec une qualité d'image de 70%:

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

J'espère que ça t'as aidé

11
Al.
<?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");
    }
}
    ?>

Ceci est un très bon script miniature =) Voici un exemple:

$ path = Le chemin vers le dossier où se trouve l'image d'origine. $ name = Le nom du fichier dont vous souhaitez créer une miniature. $ thumbpath = Chemin d'accès au répertoire dans lequel vous souhaitez enregistrer la miniature. $ maxwidth = la largeur maximale de la vignette dans PX par exemple. 100 (qui sera 100px).

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

10
Patrik

Vous voudrez peut-être examiner Image Magick , généralement considéré comme la bibliothèque standard de facto pour le traitement d'image. Nécessite un module php supplémentaire pour être installé cependant, je ne sais pas si certains/qui sont disponibles dans une installation par défaut.

HTH.

4
falstro

PHP a quelques fonctions de traitement d'image ainsi que imagecreatefrompng et imagejpeg fonction . Le premier créera une représentation interne d'un fichier image PNG tandis que le second est utilisé pour enregistrer cette représentation en tant que fichier image JPEG.

3
Gumbo

Voir cette liste de bibliothèques d'images php . Fondamentalement, c'est Gd ou Imagemagick.

2
Draemon

Je sais que ce n'est pas une réponse exacte à l'OP, mais comme des réponses ont déjà été données ...

Avez-vous vraiment besoin de le faire en PHP?
Ce que je veux dire, c'est que si vous avez besoin de convertir beaucoup d'images, le faire en PHP n'est peut-être pas le meilleur moyen: vous serez confronté à memory_limit, max_execution_time, ...

Je dirais également que Gd pourrait ne pas vous offrir le meilleur rapport qualité/taille; mais je n'en suis pas sûr (si vous faites une comparaison entre Gd et d'autres solutions, je suis très intéressé par les résultats ;-))

Une autre approche, n'utilisant pas PHP, serait d'utiliser Image Magick via la ligne de commande (et non pas comme une extension PHP comme d'autres personnes ont suggéré)

Vous devez écrire un script Shell qui passe par tous les .png fichiers et les donne à

  • convert pour créer un nouveau .jpg fichier pour chaque .png fichier
  • ou mogrify pour travailler directement sur le fichier d'origine et le remplacer.


En guise de note: si vous faites cela directement sur votre serveur de production, vous pouvez mettre un peu de temps entre les bouquets de conversions, pour le laisser refroidir un peu parfois ^^


J'ai utilisé le script Shell + convert/mogrify plusieurs fois (en les faisant exécuter pendant quelque chose comme 10 heures une fois) , et ils font très bien le travail :-)

2
Pascal MARTIN