PHP постоянно сжимает PNG

0

Я пытаюсь сжать PNG файл до тех пор, пока не ударяю целевую метку, используя метод грязных. Но я изо всех сил пытаюсь добиться сжатия. Я знаю, что в конечной точке я установил сжатие в 0, но это потому, что я ожидаю, что файл был сжат.

1) Загрузите png с формой

2) Пока размер больше 25000, сжимайте его на 5 (imagepng())

Мне нужно использовать буфер для повторного захвата изображения вместо постоянного его сохранения (я думаю, что это хороший способ). Следующий код - это не мой производственный код, а точный метод.

$postedImg = $_FILES['file']['tmp_name'];
$size = filesize($postedImg); // eg 35000
$info = getimagesize($postedImg);
$mime = $info['mime'];
if($mime === 'image/png') 
    $img = imagecreatefrompng($postedImg);

    while($size > 25000){
        ob_start();
        imagepng($img , NULL, 5);
        $obImgStr = ob_get_contents();
        $img = imagecreatefromstring($obImgStr);
        ob_end_clean();
        $size = filesize($obImgStr);
    }
    imagepng($img, 'image/goes/here.png', 0);
  • 1
    Сжатие сжатого файла, как правило, не приводит к улучшению и может привести к большему файлу. В любом случае, вы не можете сжать любое произвольно большое изображение до 25 КБ. Начиная с изображения, алгоритмы сжатия приведут к полученному размеру. Если это больше, чем 25k, то вы застряли.
  • 0
    25000 байт ~ = 25 кб ... давай! 25kb PNG - все еще очень маленькое изображение. Зачем вам нужно это сжимать?
Показать ещё 1 комментарий
Теги:

1 ответ

2
Лучший ответ

Сжатие PNG без потерь. Если вы сжимаете его до 5, а затем снова 5, вы все равно останетесь 5. Точно так же, когда вы наконец выведете свое изображение на 0 (это произойдет только в том случае, если ваша первая попытка в 5 ударит по 25k), то, что вы на самом деле делаете, уничтожает любое сжатие, которое вы только что сделали. Это потому, что качество изображения вообще не зависит от сжатия (имя документа для этого параметра вводит в заблуждение). Это точно так же, как zip... все, что он делает, - это уменьшить размер файла, с недостатком, что файл нужно переустановить на другом конце.

Лучший способ приблизиться к этому - сжать его постепенно, начиная с, например, 1, затем 2, затем 3 до тех пор, пока вы не получите нужный размер. Тем не менее, как сказано в комментариях выше, вы никогда не сможете достичь своего целевого размера.

  • 0
    А ну понятно. Спасибо за это объяснение. Я буду изменять размеры, пока не достигну своей отметки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню