PHP-解压缩Base64解码图像失败

3

我从前端获取到的图片是以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

我的函数会上传原始图片。

一个普遍的观点:尝试压缩已经被压缩过的图像格式(png、gif、jpg)是没有任何意义的。 - arkascha
无论如何它都会减小尺寸,是的,我知道我也会失去清晰度。有没有办法从后端减小图像的大小?据我所知,base64 将图像转换为字符串,但不会减小尺寸。我检查了原始文件和上传的文件。@arkascha - version 2
“无法打开流:没有这样的文件或目录”的错误告诉我,压缩图像未被正确保存(和/或读取);这就是我从中得到的信息。@AmeliaEarheart” - Funk Forty Niner
不!压缩已经压缩过的图像不会减小其大小!至少不会在一个微不足道的水平上。所以这没有意义。而且它也不会降低清晰度,你理解错了。有不同类型的压缩。在接收端,您仍然需要解压缩它,否则您将不会得到一张图像,而是一个压缩文件。 - arkascha
啊,我现在明白了;感谢您的澄清。我希望答案对您有用 :-) @AmeliaEarheart 祈祷 - Funk Forty Niner
显示剩余7条评论
1个回答

0
为什么不使用这个函数来创建任何类型的图像,从base64编码的图像字符串中?
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 "";
    }
}

它会减小图像的尺寸吗?@Haresh Vidja - version 2
你想要减小图片尺寸或者降低图片质量? - Haresh Vidja
图像大小主要是我关心的,即使失去一点清晰度也无所谓。但是图像大小最重要。@Haresh Vidja - version 2
@AmeliaEarheart,我已经修改了图像调整大小的代码,并在函数中传递自定义高度和宽度参数。 - Haresh Vidja
谢谢亲爱的,我会尝试这段代码。希望能解决问题。@Haresh Vidja - version 2
很高兴收到你的来信,亲爱的@AmeliaEarheart,请让我知道如果需要我帮忙的地方。 - Haresh Vidja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接