PHP Снижение качества всех типов изображений

Я ищу библиотеку, которая может уменьшить качество всех типов изображений (PNG, GIF и JPEG).
Я знаю, что могу уменьшить JPEG, используя imagejpeg()
Я также знаю, что могу уменьшить PNG, используя imagepng(), хотя это недостаточно мощный.

Мне нужно что-то, что может конвертировать PNG 24 в PNG8 без удаления альфы.

Не могу использовать ImageMagick, так как не могу ничего установить на свой сервер.

РЕДАКТИРОВАТЬ:
Мне также нужно что-то, что может конвертировать из 32-битного в 8 (я уверен, что это то же самое, что и из 32-битного)

Нашел идею здесь< /а>

Спасибо


person Ron    schedule 07.12.2012    source источник
comment
Может быть, я что-то упускаю, но преобразование из PNG24 в PNG8 по определению удаляет альфа-данные.   -  person ceejayoz    schedule 07.12.2012
comment
Нет, вы абсолютно правы. PNG8 — это PNG без альфа-канала. Это просто объединенные каналы RBG, без отдельного канала RGB + Alpha.   -  person Dorvalla    schedule 07.12.2012
comment
так как же я могу сохранять изображения в формате PNG 8 в Photoshop, сохраняя альфу?   -  person Ron    schedule 07.12.2012
comment
Здесь люди очень ошибаются. У меня есть много изображений PNG8 (оттенки серого) с альфа-данными.   -  person mmgp    schedule 07.12.2012
comment
PNG 24 похож на 8, но поддерживает 16 миллионов цветов и лучше сохраняет цветовые вариации, такие как градиенты, и помогает предотвратить появление полос. PNG 8 может иметь альфа-канал, но поскольку он всего 8-битный, в нем меньше цветов (256). Я не ошибаюсь.   -  person Ron    schedule 07.12.2012
comment
@ Рон, я знаю, что ты не такой. Похоже, они думают, что PNG всегда нужен полный альфа-канал (таким образом, PNG X + 8), чтобы иметь альфа-данные. Вот очень простой пример PNG8 с альфа-каналом (я могу загрузить цветную версию PNG8 и содержащую альфа-данные, если это кажется невозможным по какой-либо причине): s16.postimage.org/lkbjf58kh/gearsgrayscale.png   -  person mmgp    schedule 07.12.2012
comment
Проверьте TinyPng — они делают почти то же самое. Вы можете легко создать скрипт, который отправляет изображение на их службу, а затем возвращает его. Я могу предоставить пример кода, если это покажется вам интересным.   -  person Emil M    schedule 16.12.2012
comment
В вашем вопросе кажется небольшое противоречие. Вы ищете библиотеку, но не можете ее установить. Imagemagick, безусловно, хороший инструмент для того, что вы пытаетесь сделать. Как насчет того, чтобы клиенты загружали преобразованные изображения с отдельного сервера, конфигурацию которого вы можете контролировать? Или, возможно, реализовать преобразование изображений в качестве службы SOAP, опять же на оборудовании, которым вы можете управлять, которое предоставляется заблокированному рабочему серверу? И то и другое можно сделать в облаке, например, на Heroku, который запустит для вас гем rmagick, если вы реализуете его на Ruby. Вероятно, это возможно и в PHP.   -  person Gene    schedule 16.12.2012
comment
EmilM - Я не думал об использовании другого сервиса, но это может быть хорошим решением, если я хочу иметь еще меньший размер. Gene - библиотеку не нужно устанавливать, она может быть автономной. например, давайте посмотрим на jQuery в JavaScript - это библиотека, и вам не нужно ее устанавливать...   -  person Ron    schedule 17.12.2012


Ответы (4)


Чтобы преобразовать любое изображение PNG в 8-битный PNG, используйте эту функцию, которую я только что создал.

function convertPNGto8bitPNG()

  function convertPNGto8bitPNG($sourcePath, $destPath) {
    $srcimage = imagecreatefrompng($sourcePath);
    list($width, $height) = getimagesize($sourcePath);
    $img = imagecreatetruecolor($width, $height);
    $bga = imagecolorallocatealpha($img, 0, 0, 0, 127);
    imagecolortransparent($img, $bga);
    imagefill($img, 0, 0, $bga);
    imagecopy($img, $srcimage, 0, 0, 0, 0, $width, $height);
    imagetruecolortopalette($img, false, 255);
    imagesavealpha($img, true);
    imagepng($img, $destPath);
    imagedestroy($img);
    }

Параметры

$sourcePath — путь к исходному PNG-файлу $destPath — путь к целевому PNG-файлу

convertPNGto8bitPNG('pfc.png', 'pfc8bit.png');
person harikrishnan.n0077    schedule 16.12.2012

Я знаю, что вам не нужна библиотека GD, но с этим кодом:

$img = imagecreatefrompng($src);
imagesavealpha($img, true);
imagepng($img, $dst, 9, PNG_ALL_FILTERS);
imagedestroy($img);

Оптимизированное изображение примерно на 40% меньше исходного размера, а альфа-канал не удаляется.

Какой процент оптимизации вы ищете?

person Tiger-222    schedule 11.12.2012
comment
это просто сжимает изображение и сохраняет альфу, но сохраняется с исходными битами изображения. сохранение изображения в формате png 8 без применения каких-либо фильтров уменьшит его размер как минимум на 65% (проверено в фотошопе). - person Ron; 15.12.2012

Пожалуйста, попробуйте это, это тот результат, который вы ищете?

<?php
$size = getimagesize("original.png");
$source = imagecreatefrompng("original.png");
$target = imagecreate($size[0], $size[1]);
imagecopy($target, $source, 0, 0, 0, 0, $size[0], $size[1]);
imagepng($target,"copy.png");  
person mattsches    schedule 13.12.2012

Благодаря опыту, который у меня есть с PHP, у меня всегда были некоторые трудности с обработкой изображений (используя GD, стандартную библиотеку).
Я считаю, что без каких-либо расширений PHP не указано. Я предлагаю вам использовать какое-нибудь расширение, которое облегчит работу, например: ImageMagick

После установки расширения попробуйте следующее:

# Load your image
$im = new Imagick('your-png32-image.png'); 
# Set quality/colors
$im->setImageFormat('PNG8');
$colors = min(255, $im->getImageColors());
$im->quantizeImage($colors, Imagick::COLORSPACE_RGB, 0, false, false);
# 8bits
$im->setImageDepth(8);
# Save image
$im->writeImage('your-png8-image.png');
person Fred Wuerges    schedule 15.12.2012