Использовать PHP для преобразования PNG в JPG с сжатием?
У меня есть куча высококачественных файлов PNG. Я хочу использовать PHP для преобразования их в JPG из-за меньших размеров файлов при сохранении качества. Я хочу отображать JPG файлы в Интернете.
Есть ли у PHP функции/библиотеки для этого? Является ли качество/сжатие хорошим?
Ответы
Ответ 1
Будьте осторожны с тем, что вы хотите преобразовать. 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.
Ответ 2
Сделайте это для безопасного преобразования 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);
Ответ 3
Это небольшой пример, который преобразует "image.png" в "image.jpg" с качеством изображения 70%:
<?php
$image = imagecreatefrompng('image.png');
imagejpeg($image, 'image.jpg', 70);
imagedestroy($image);
?>
Надеюсь, что поможет
Ответ 4
<?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");
}
}
?>
Это очень хорошее миниатюра script =)
Вот пример:
$path = Путь к папке, где находится исходное изображение.
$ name = Имя файла, в котором вы хотите сделать эскиз.
$ thumbpath = путь к каталогу, в котором вы хотите сохранить миниатюру.
$ maxwidth = максимальная ширина миниатюры в PX, например. 100 (который будет составлять 100 пикселей).
createThumbnail($path, $name, $thumbpath, $maxwidth);
Ответ 5
Возможно, вы захотите изучить Image Magick, который обычно считается стандартной библиотекой де-факто для обработки изображений. Требуется установить дополнительный php-модуль, хотя и не уверен, что они доступны или доступны по умолчанию.
НТН.
Ответ 6
PHP имеет некоторые функции обработки изображений вместе с imagecreatefrompng
и imagejpeg
function. Первая создаст внутреннее представление файла изображения PNG, а вторая - для сохранения этого представления в виде файла изображения JPEG.
Ответ 7
Смотрите этот список библиотек изображений php. В основном это GD или Imagemagick.
Ответ 8
Я знаю, что это не точный ответ OP, но поскольку ответы уже даны...
Вам действительно нужно сделать это на PHP?
Что я имею в виду: если вам нужно преобразовать много изображений, выполнение этого в PHP может быть не лучшим образом: вы столкнетесь с memory_limit
, max_execution_time
,...
Я бы также сказал, что GD может не получить вам лучшее соотношение качества и размера; но не уверен в этом (если вы проводите сравнение между GD и другими решениями, меня очень интересуют результаты;-))
Другим подходом, не использующим PHP, было бы использовать Image Magick через командную строку (а не как расширение PHP, как другие люди предложил)
Вам нужно будет написать shell- script, который будет проходить через все .png
файлы, и даст их либо
-
convert
для создания нового файла .jpg
для каждого .png
файла
- или
mogrify
, чтобы непосредственно работать с исходным файлом и переопределять его.
В качестве побочного элемента: если вы делаете это прямо на своем производственном сервере, вы можете добавить некоторое время сна между пучками конверсий, чтобы немного остыть, иногда ^^
Я использую оболочку script + convert
/mogrify
несколько раз (заставляя их запускать что-то вроде 10 часов один раз), и они действительно выполняют работу: -)