php- сжатие изображения, декодированного в формате base64, не удается

Я получаю изображения в виде переднего конца строки в кодировке base64, и мне нужно их декодировать и сохранять как изображения на сервере. Изображение может быть любого формата - png, gif или jpeg. Эта часть работает нормально. Но иногда изображения, загруженные пользователями, могут быть очень большого размера, поэтому я пытаюсь сжать их из бэкэнда, и эта часть с треском провалилась.

У меня две функции. Один для преобразования строки base64 в изображение, а другой для его сжатия.

Это функция, которая преобразует строку в изображение.

function uploadTimelineImage($base64Img)
{
    $data= array(); 
    $upAt=date('YmdHis');

    if (strpos($base64Img, 'data:image/png;base64') !== false) 
    {
        $img = str_replace('data:image/png;base64,', '', $base64Img);
        $img = str_replace(' ', '+', $img);
        $data = base64_decode($img);    
        $extension= 'png';
    }

    if (strpos($base64Img, 'data:image/gif;base64') !== false) 
    {
        $img = str_replace('data:image/gif;base64,', '', $base64Img);
        $img = str_replace(' ', '+', $img);
        $data = base64_decode($img);    
        $extension= 'gif'; 
    }

    if (strpos($base64Img, 'data:image/jpeg;base64') !== false) 
    {
        $img = str_replace('data:image/jpeg;base64,', '', $base64Img);
        $img = str_replace(' ', '+', $img);
        $data = base64_decode($img);    
        $extension= 'jpeg'; 
    }

    $fileName     = 'img'.$upAt.$extension;
    $filePath     = 'foldername/'.'img'.$upAt.$extension;

    //upload image to folder
    $success = file_put_contents($filePath, $data);
    $result  = $success ? 1 : 0;

    //call to compression function
    $compressThisImg= $filePath;
    $d = compress($compressThisImg, $fileName, 80);

    if($result==1)
    {
        return $fileName;
    }
    else
    {
        return null;
    }

}

И это функция, которая выполняет сжатие:

//Function to compress an image
function compress($source, $destination, $quality) 
{
    $info = getimagesize($source);

    if ($info['mime'] == 'image/jpeg') 
        $image = imagecreatefromjpeg($source);

    elseif ($info['mime'] == 'image/gif') 
        $image = imagecreatefromgif($source);

    elseif ($info['mime'] == 'image/png') 
        $image = imagecreatefrompng($source);

    imagejpeg($image, $destination, $quality);

    return $destination;
}

Но приведенная выше функция не выполняет никакого сжатия, она выдает ошибку:

 failed to open stream: No such file or directory

и моя функция загружает исходное изображение.


person version 2    schedule 08.08.2016    source источник
comment
Общее замечание: пытаться сжимать изображения уже сжатого формата (png, gif, jpg) не имеет никакого смысла.   -  person arkascha    schedule 08.08.2016
comment
Если изображение такое большое, возможно, .ini файлы вашей системы нужно отрегулировать, чтобы обрабатывать файлы большего размера. Если все же загружаются файлы большего размера, вы можете вычеркнуть этот комментарий. Что-то еще вызывает это, и я не могу понять, что это такое. Однако проверьте настройки пути и разрешения.   -  person Funk Forty Niner    schedule 08.08.2016
comment
Это все равно уменьшит размер, и да, я знаю, что тоже потеряю четкость. Есть ли способ уменьшить размер изображения из бэкэнда. Насколько мне известно, base64 преобразует изображение в строку, при этом размер не уменьшается. Я проверил исходный файл и загруженный файл. @arkascha   -  person version 2    schedule 08.08.2016
comment
Речь идет не о загрузке изображений большего размера, я пытаюсь их немного сжать, чтобы они загружались немного быстрее. @Fred -ii-   -  person version 2    schedule 08.08.2016
comment
Ошибка не удалось открыть поток: нет такого файла или каталога для меня, говорит мне, что сжатое изображение не сохраняется (и / или не читается) правильно; вот что я получаю от этого. @AmeliaEarheart   -  person Funk Forty Niner    schedule 08.08.2016
comment
Нет! Сжатие уже сжатого изображения не уменьшит его размер! По крайней мере, не выше тривиального уровня. Так что смысла нет. И это не уменьшит резкость, вы ошиблись. Есть разные виды сжатия. В любом случае вам придется снова распаковать его на принимающей стороне, иначе у вас будет не изображение, а сжатый файл.   -  person arkascha    schedule 08.08.2016
comment
Я обязательно хотел бы знать, где / как назначен $destination. Опять же: failed to open stream: No such file or directory мне, скорее всего, это как-то связано. Я вижу, что вы в ответе ниже. Я очень надеюсь, что это решит проблему здесь.   -  person Funk Forty Niner    schedule 08.08.2016
comment
На самом деле, то, что я пытаюсь сделать, это сжать изображение и загрузить его, но это не сработало ... поэтому я пытался сначала загрузить изображение (эта часть работала хорошо), затем сжать изображение и заменить загруженное изображение со сжатым изображением. Но сжатие не сработало. Итак, пункт назначения такой же, как путь к изображению @Fred -ii-   -  person version 2    schedule 08.08.2016
comment
Ах, теперь я понимаю; Спасибо за разъяснения. Надеюсь, тогда ответ сработает для вас :-) @AmeliaEarheart скрестив пальцы   -  person Funk Forty Niner    schedule 08.08.2016
comment
Ха-ха .... Большое спасибо @Fred -ii-   -  person version 2    schedule 08.08.2016
comment
@AmeliaEarheart Пожалуйста. Однако этот ответ вам не подходит? Я не видел, чтобы это было принято, или каких-либо других комментариев там.   -  person Funk Forty Niner    schedule 08.08.2016
comment
Для меня это проблема пути. Можете выложить полный текст ошибки? Вы также можете устранить проблему с помощью этого контрольного списка: stackoverflow.com/questions/36577020/   -  person Vic Seedoubleyew    schedule 20.08.2016


Ответы (1)


Почему вы не используете эту функцию для создания любого типа изображения из строки изображения в кодировке base64 edncoded?

function uploadTimelineImage($base64Img,$h,$w)
{
    $im = imagecreatefromstring($base64Img);
    if ($im !== false) {


        $width = imagesx($im);
        $height = imagesy($im);
        $r = $width / $height; // ratio of image

        // calculating new size for maintain ratio of image
        if ($w/$h > $r) {
            $newwidth = $h*$r; 
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }

        $dst = imagecreatetruecolor($newwidth, $newheight);
        imagecopyresampled($dst, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        imagedestroy($im);

        $fileName  = 'img'.date('Ymd').'.jpeg';
        $filepath =  'folder/'.$fileName  ;
        imagejpeg($dst,$filepath);

        imagedestroy($dst);
        return $fileName;
    }
    else
    {
        return "";
    }
}
person Haresh Vidja    schedule 08.08.2016
comment
Уменьшит ли это размер изображения? @Haresh Vidja - person version 2; 08.08.2016
comment
вы хотите уменьшить размер изображения или качество изображения? - person Haresh Vidja; 08.08.2016
comment
В основном размер изображения ... Мне все равно, если я потеряю немного четкости. Но в основном размер изображения. @Haresh Vidja - person version 2; 08.08.2016
comment
@AmeliaEarheart, я изменил код для изменения размера изображения, указав нестандартную высоту и ширину, передаваемую в функцию. - person Haresh Vidja; 08.08.2016
comment
Спасибо, дорогой .. я попробую этот код. Надеюсь, это решит проблему. @Haresh Vidja - person version 2; 08.08.2016
comment
Рад слышать с вашей стороны, дорогая @AmeliaEarheart, дайте мне знать, если что-нибудь понадобится с моей стороны. - person Haresh Vidja; 08.08.2016