Используйте PHP для преобразования PNG в JPG со сжатием?
Вопрос
У меня есть куча PNG-файлов высокого качества.Я хочу использовать PHP для преобразования их в JPG из-за меньшего размера файлов при сохранении качества.Я хочу отображать файлы JPG в Интернете.
Есть ли в PHP функции/библиотеки для этого?Качество/сжатие хорошее?
Решение
Сделайте это, чтобы безопасно преобразовать 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);
Другие советы
Будьте осторожны с тем, что вы хотите преобразовать. 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.
Это небольшой пример, который преобразует 'image.png' в 'image.jpg' с качеством изображения 70%:
<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70);
imagedestroy($image);
?>
Надеюсь, это поможет
<?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);
Возможно, вы захотите изучить Магия изображений, обычно считается стандартной библиотекой де-факто для обработки изображений.Однако требуется установка дополнительного модуля php, не уверен, доступны ли они/которые доступны при установке по умолчанию.
ХТХ.
PHP имеет некоторые функции обработки изображений наряду с imagecreatefrompng
и функция imagejpeg
. Первый создаст внутреннее представление файла изображения PNG, а второй используется для сохранения этого представления в виде файла изображения JPEG.
См. этот список библиотек изображений php . По сути это GD или Imagemagick.
Я знаю, что это не точный ответ на ФП, но поскольку ответы уже были даны...
Вам действительно нужно сделать это на PHP?
Я имею в виду :если вам нужно конвертировать много изображений, делать это на PHP может быть не лучшим способом:вы столкнетесь с memory_limit
, max_execution_time
, ...
Я бы также сказал, что GD может не обеспечить вам наилучшее соотношение качества и размера;но не уверен в этом (если вы сравните GD с другими решениями, меня очень заинтересуют результаты ;-))
Другой подход, не использующий PHP, заключался бы в использовании Магия изображений через командную строку (а не как расширение PHP, как предлагали другие люди)
Вам придется написать сценарий оболочки, который пройдет через все .png
файлы и передает их либо
convert
создать новый.jpg
файл для каждого.png
файл- или
mogrify
чтобы напрямую работать с исходным файлом и переопределить его.
В качестве примечания:если вы делаете это непосредственно на своем рабочем сервере, вы можете оставить некоторое время ожидания между группами преобразований, чтобы иногда дать ему немного остыть ^^
Я использую сценарий оболочки + convert
/mogrify
несколько раз (заставляя их бегать около 10 часов один раз), и они отлично справляются со своей задачей :-)