PHP уменьшить размер файла изображения - PullRequest
0 голосов
/ 16 июня 2020

Мое приложение позволяет пользователям загружать кучу изображений, которые позже отправляются в виде вложения электронной почты. Проблема появляется, если размер файла отправляемых изображений больше, чем принимается по электронной почте. Я хочу уменьшить размер файла изображения до тех пор, пока он не станет меньше 5 МБ, и вот как я пытался это сделать:

/*..some code...*/
$img_quality = 75;
while (filesize($path) >= 5242880) {
   $img_string = file_get_contents($path);
   $img = imagecreatefromstring($img_string);
   $path = $this->getFilePath($file, $file_section, $entity_id);
   imagejpeg($img, $path, $img_quality);
   $img_quality--;
}
/*..some code...*/

//Functions I am calling
public function getFilePath($upload, $section, $id = null) {
    $path = base_path('../upload').$this->downloadOverwrite($upload, $section, $id);
    if(!$upload) {
        return $path;
    }
    if(!file_exists($path)) {
        return null;
    }
    $tmppath = @tempnam("tmp", "myapp");
    file_put_contents($tmppath, file_get_contents($path));
    return $tmppath;
}
public function downloadOverwrite($upload, $section, $id = null, $config = []) {
    $section = !empty($upload['entity']) ? $upload['entity'] : $section;
    $id = !empty($upload['entity_id']) ? $upload['entity_id'] : $id;
    $path = empty($id) ? "/$section" : "/$section/$id";
    if(!empty($upload)) $path .= "/{$upload['fs_name']}"; 
    return $path;
}

Этот код действительно работает, но если размер файла изображения слишком велик , требуется слишком много времени, прежде чем изображение будет сжато до желаемого значения. Есть ли лучшее решение для этого?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

На случай, если у кого-то возникнет похожая проблема, вот l oop, который я использовал в конце, и который мне очень понравился. Возможно, это не лучшее решение, но оно достаточно справедливое:

$image_width = getimagesize($path)[0];
while (filesize($path) >= 5242880) {
    $image_width -= 50;
    $img_string = file_get_contents($path);
    $img = imagecreatefromstring($img_string);
    $path = $this->getFilePath($file, $file_section, $entity_id);
    $img = imagescale($img, $image_width);
    imagejpeg($img, $path);
}

Я уменьшаю ширину изображения, а высота автоматически уменьшается с учетом соотношения сторон. Это приводит к довольно быстрому уменьшению размера файла при сохранении качества изображения примерно на том же уровне, что и до масштабирования.

0 голосов
/ 16 июня 2020

на самом деле да, есть пакет, который очень популярен для управления изображениями в php, который имеет хорошую интеграцию с laravel:

http://image.intervention.io/getting_started/installation

, поэтому с этим пакетом вы делаете следующее:

$ php composer.phar require intervention/image

и после добавления псевдонимов, если laravel <5.5 вы публикуете sh файлы поставщика: </p>

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent"

, вы можете заменить обработку изображений на это:

// create instance
$img = Image::make('public/foo.jpg');

// resize image to fixed size
$img->resize(300, 200);

для изменения размера или выполнения каких-либо действий, например предотвращения увеличения размера, например:

// prevent possible upsizing
$img->resize(null, 400, function ($constraint) {
    $constraint->aspectRatio();
    $constraint->upsize();
});

, или любых других действий, которые вы хотели бы сделать в соответствии с документацией. надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...