Use PHP para converter PNG para JPG com compactação?
Pergunta
Eu tenho um monte de arquivos PNG de alta qualidade. Eu quero usar o PHP para convertê-los em JPG porque ele é de arquivos menores, mantendo a qualidade. Eu quero mostrar os arquivos JPG na web.
O PHP tem funções / bibliotecas para fazer isso? É a qualidade / compressão bom?
Solução
Faça isso para converter com segurança um PNG para JPG com a transparência em branco.
$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);
Outras dicas
Tenha cuidado com o que você deseja converter. não JPG não suporta alfa-transparência enquanto PNG faz. Você vai perder essa informação.
Para converter, você pode usar a seguinte função:
// 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 função usa o imagecreatefrompng()
e funções imagejpeg()
da biblioteca GD.
Este é um pequeno exemplo que irá converter 'image.png' para 'image.jpg' em qualidade de imagem de 70%:
<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70);
imagedestroy($image);
?>
Espero que ajude
<?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 é um muito bom roteiro de miniaturas =) Aqui está um exemplo:
$ path = O caminho para a pasta onde a imagem original é. $ Name = O nome do arquivo que você quer fazer uma miniatura de. $ Thumbpath = O caminho para o diretório onde você deseja que a miniatura para ser salvos em. $ Maxwidth = a largura máxima da miniatura em PX por exemplo. 100 (wich será 100px).
createThumbnail($path, $name, $thumbpath, $maxwidth);
Você pode querer olhar para Imagem Magick , geralmente considerada a biblioteca padrão de fato para processamento de imagem. Requer um módulo php extra para ser instalado no entanto, não tenho certeza se qualquer / que estão disponíveis em uma instalação padrão.
HTH.
PHP tem algum href="http://docs.php.net/manual/en/book.image.php" imagem funções de processamento juntamente com o imagecreatefrompng
e função imagejpeg
. O primeiro irá criar uma representação interna de um arquivo de imagem PNG, enquanto o segundo é usado para salvar a representação como arquivo de imagem JPEG.
esta lista de bibliotecas de imagem php . Basicamente é GD ou Imagemagick.
Eu sei que não é uma resposta exata para o OP, mas como respostas já ser dada ...
Você realmente precisa fazer isso em PHP?
O que quero dizer é: se você precisa converter um monte de imagens, fazê-lo em PHP pode não ser a melhor maneira: você vai ser confrontado com memory_limit
, max_execution_time
, ...
Também gostaria de dizer GD não pode obter-lhe o melhor relação qualidade / tamanho; mas não tenho certeza sobre isso (se você fizer uma comparação entre GD e outras soluções, estou muito interessado pelos resultados ;-))
Outra abordagem, não utilizando PHP, seria usar Imagem Magick via linha de comando (e não como uma extensão do PHP como outras pessoas sugeriram)
Você teria que escrever um shell-script que passa por todos os arquivos .png
, e dá-los a qualquer
-
convert
para criar um novo arquivo.jpg
para cada arquivo.png
-
mogrify
para diretamente o trabalho no arquivo original e substituí-lo.
Como nota: se você estiver fazendo isso diretamente no servidor de produção, você pode colocar um pouco de tempo de sono entre cachos de conversões, para deixá-lo esfriar um pouco, às vezes ^^
Eu tenho usar o script shell + convert
/ mogrify
algumas vezes (tê-los correr para algo como 10 horas uma vez) , e eles fazem o trabalho muito bem: -)