2009-07-29 95 views
40

Tengo un montón de archivos PNG de alta calidad. Quiero usar PHP para convertirlos a JPG debido a que tiene tamaños de archivo más pequeños y mantiene la calidad. Quiero mostrar los archivos JPG en la web.¿Utiliza PHP para convertir PNG a JPG con compresión?

¿Tiene PHP funciones/bibliotecas para hacer esto? ¿La calidad/compresión es buena?

+6

Tenga en cuenta que dependiendo de las imágenes, JPG no siempre tendrá un tamaño de archivo más pequeño que un PNG, por lo que debe asegurarse de que está utilizando el adecuado para su situación. http://lbrandy.com/blog/2008/10/my-first-and-last-webcomic/ – jimyi

Respuesta

56

Tenga cuidado con lo que quiere convertir. JPG no admite transparencia alfa mientras que PNG lo hace. Perderás esa información.

Para convertir, se puede utilizar la siguiente función:

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

Esta función utiliza los imagecreatefrompng() y los imagejpeg() funciones de la biblioteca GD.

+9

Por favor, eche un vistazo a la respuesta de danLeon para convertir PNG a JPG de forma segura. – Codemole

+4

Esta respuesta no funciona con archivos png con transparencia. –

4

Es posible que desee buscar en Image Magick, generalmente se considera la biblioteca estándar de facto para el procesamiento de imágenes. Sin embargo, requiere un módulo adicional de php para ser instalado, no estoy seguro si alguno/cuáles están disponibles en una instalación predeterminada.

HTH.

9

Este es un pequeño ejemplo que convertirá 'image.png' a 'imagen.jpg' a 70% calidad de la imagen:

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

Espero que ayude

2

Yo sé que no es una copia exacta responda al OP, pero como ya se dieron las respuestas ...

¿Realmente necesita hacer esto en PHP?
Lo que quiero decir es: si usted necesita para convertir una gran cantidad de imágenes, hacerlo en PHP podría no ser la mejor manera: se le enfrenta a memory_limit, max_execution_time, ...

Me gustaría decir también GD podría no obtener la mejor relación calidad/tamaño; pero no estoy seguro de eso (si lo hace una comparación entre GD y otras soluciones, estoy muy interesado por los resultados ;-))

Otro enfoque, no usando PHP, sería utilizar Image Magick a través de la línea de comandos (y no como una extensión de PHP al igual que otras personas sugirieron)

Habría que escribir un script de shell que pasa a través de todos los archivos .png, y les da a cualquiera

  • convert para crear un nuevo .jpg archivo para e ach .png archivo
  • o mogrify para trabajar directamente en el archivo original y anularlo.


Como nota al margen: si usted está haciendo esto directamente en el servidor de producción, se puede poner un poco de tiempo de sueño entre los racimos de las conversiones, para dejar que se enfríe un poco a veces ^^


tengo utilizar el script de shell + convert/mogrifyun par de veces (tener que correr por algo así como 10 horas una vez), y lo hacen el trabajo muy bien :-)

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

Este es un muy buen guión miniatura =) He aquí un ejemplo:

$ path = La ruta de la carpeta en la que la imagen original es. $ name = El nombre de archivo del archivo del que quiere hacer una miniatura. $ thumbpath = La ruta al directorio donde desea guardar la miniatura. $ maxwidth = el ancho máximo de la miniatura en PX, por ejemplo. 100 (que será 100px).

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

+1

¡Lo usé y funcionó bien, gracias! – user1053263

120

hacer esto para convertir de manera segura un archivo PNG a JPG con la transparencia en blanco.

$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

Esta es la manera más correcta de convertir PNG a JPG de forma segura. Quiero agregar la calificación top ++ para esta respuesta. – Codemole

+1

Esto es mucho mejor, se ocupa de la transparencia. ¡Dos respuestas principales ahora están vinculadas al nivel! –

+1

Esto definitivamente debería ser la respuesta aceptada – Scalpweb