Использовать PHP для преобразования PNG в JPG со сжатием? - PullRequest
47 голосов
/ 29 июля 2009

У меня есть куча высококачественных файлов PNG. Я хочу использовать PHP для преобразования их в JPG из-за меньшего размера файла при сохранении качества. Я хочу отображать файлы JPG в Интернете.

Есть ли в PHP функции / библиотеки для этого? Качество / сжатие хорошее?

Ответы [ 8 ]

161 голосов
/ 21 января 2012

Это необходимо для безопасного преобразования PNG в JPG с прозрачностью белого цвета.

$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);
58 голосов
/ 29 июля 2009

Будьте осторожны с тем, что вы хотите конвертировать. JPG не поддерживает альфа-прозрачность, а PNG. Вы потеряете эту информацию.

Для конвертации вы можете использовать следующую функцию:

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

Эта функция использует функции imagecreatefrompng() и imagejpeg() из библиотеки GD.

10 голосов
/ 07 февраля 2010
<?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");
    }
}
    ?>

Это очень хороший миниатюрный скрипт =) Вот пример:

$ path = Путь к папке, в которой находится исходное изображение. $ name = имя файла, из которого вы хотите сделать эскиз. $ thumbpath = Путь к каталогу, в который вы хотите сохранить миниатюру. $ maxwidth = максимальная ширина миниатюры в PX, например. 100 (который будет 100px).

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

10 голосов
/ 29 июля 2009

Это небольшой пример, который преобразует 'image.png' в 'image.jpg' с качеством изображения 70%:

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

Надеюсь, что поможет

4 голосов
/ 29 июля 2009

Возможно, вы захотите взглянуть на Image Magick , который обычно считается стандартной библиотекой де-факто для обработки изображений. Требует установки дополнительного модуля php, хотя и не уверен, что таковые имеются / имеются в установке по умолчанию.

НТН.

3 голосов
/ 29 июля 2009

PHP имеет некоторые функции обработки изображений вместе с imagecreatefrompng и imagejpeg функцией . Первый создаст внутреннее представление файла изображения PNG, а второй используется для сохранения этого представления в виде файла изображения JPEG.

2 голосов
/ 29 июля 2009

Я знаю, что это не точный ответ на ФП, но, поскольку ответы уже даны ...

Вам действительно нужно сделать это на PHP?
Я имею в виду следующее: если вам нужно конвертировать много изображений, это может быть не лучшим способом сделать это на PHP: вы столкнетесь с memory_limit, max_execution_time, ...

Я бы также сказал, что GD может не дать вам наилучшее соотношение качества и размера; но не уверен насчет этого (если вы сделаете сравнение между GD и другими решениями, я очень заинтересован результатами ;-))

Другой подход, не использующий PHP, заключается в использовании Image Magick через командную строку (а не как расширение PHP, как предлагали другие люди)

Вы должны написать сценарий оболочки, который просматривает все файлы .png и передает их либо

  • convert для создания нового .jpg файла для каждого .png файла
  • или mogrify для непосредственной работы с исходным файлом и его переопределения.


Как примечание: если вы делаете это непосредственно на своем производственном сервере, вы можете поместить некоторое время сна между пакетами конверсий, чтобы иногда это немного остывало ^^


Я использую сценарий оболочки + convert / mogrify несколько раз (при их запуске около 10 часов один раз) , и они действительно хорошо выполняют свою работу: -)

2 голосов
/ 29 июля 2009

См. этот список библиотек изображений php . В основном это GD или Imagemagick.

...