Использовать PHP для преобразования PNG в JPG со сжатием?

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

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


person John    schedule 29.07.2009    source источник
comment
Обратите внимание, что в зависимости от того, что это за изображения, JPG не всегда будет иметь меньший размер файла, чем PNG, поэтому убедитесь, что вы используете правильный для вашей ситуации. lbrandy.com/blog/2008/10/my-first -and-last-webcomic   -  person jimyi    schedule 29.07.2009


Ответы (8)


Сделайте это, чтобы безопасно преобразовать 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);
person Daniel De León    schedule 21.01.2012
comment
Это наиболее правильный способ безопасного преобразования PNG в JPG. Хочу добавить к этому ответу высший рейтинг ++. - person Codemole; 28.08.2012
comment
Это намного лучше, касается прозрачности. Два главных ответа теперь привязаны к уровню! - person Matt Fletcher; 04.07.2014
comment
Ты только что сделал мой день намного лучше, дружище! Спасибо! - person WingmanImd; 19.12.2015
comment
Работает ли этот код для других типов исходных файлов, например bmp? - person Gonzalo; 06.03.2018
comment
Я знаю, что это старый вопрос, но почему это самый правильный способ конвертировать PNG в JPG? Разве этого более простого ответа недостаточно? - person Alex Lowe; 19.01.2021

Будьте осторожны с тем, что вы хотите преобразовать. 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() и _ 3_ из библиотеки GD.

person Andrew Moore    schedule 29.07.2009
comment
Ознакомьтесь с ответом danLeon, чтобы безопасно конвертировать PNG в JPG. - person Codemole; 28.08.2012

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

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

надеюсь, это поможет

person Al.    schedule 29.07.2009

<?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 (что будет 100 пикселей).

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

person Patrik    schedule 07.02.2010

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

HTH.

person falstro    schedule 29.07.2009

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

person Gumbo    schedule 29.07.2009

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

person Draemon    schedule 29.07.2009

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

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

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

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

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

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


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


Я использовал сценарий оболочки + _8 _ / _ 9_ несколько раз (один раз заставлял их работать примерно 10 часов), и они отлично справляются со своей задачей :-)

person Pascal MARTIN    schedule 29.07.2009