如何在 PHP 中将图像从 base 64 转换为它们的文件类型?

Posted

技术标签:

【中文标题】如何在 PHP 中将图像从 base 64 转换为它们的文件类型?【英文标题】:How do I convert images from base 64 to their file types in PHP? 【发布时间】:2017-03-30 21:33:45 【问题描述】:

我有包含图像作为 base 64 字符串的对象,该对象还包含图像的文件名和图像的文件类型(jpeg、png、gif 和 bmp)。 base 64 字符串已经有标签(例如“data:image/png;base64”从一开始就被删除了。

对象($myImg)的格式如下:

$myImg->fileName 包含转换后的图像应保存的名称。

$myImg->fileType 描述了文件应该保存为的格式 - 这用于在 fopen() 函数中指定路径扩展名。

$myImg->b64 包含代表图像的 64 位二进制字符串。

我的函数代码如下:

function toImg(ImageString $myImg)
    //Output file is in the same directory as the php script.
    //Uses the object's filetype attribute as the file extension.
    $outputFile = fopen($myImg->fileName . "." . $myImg->fileType, "w");
    $image = base64_decode($myImg->b64);
    fwrite($outputFile, $image);
    fclose($outputFile);

该函数创建图像文件,但尝试在 Xubuntu Image Viewer 中查看它们时出现错误。错误如下:

解释 JPEG 图像文件时出错(不是 JPEG 文件:以 0x14 0x00 开头)

读取 PNG 图像文件时出现致命错误:不是 PNG 文件。

文件似乎不是 GIF 文件。

BMP 图像有虚假的标题数据。

我查看并遵循了 base64 到图像转换的指南,但没有人遇到这些错误。

【问题讨论】:

如果 base64 数据是有效的图像内容,那应该可以工作。你从哪里得到那个对象?它是如何填充的? 图像数据是从 MS Access 数据库的 XML 文件输出中检索到的。 如果您尝试在浏览器中显示带有<img>-tag 的base 64 格式的图像(带有data:image/png;base64, 前缀(当然,使用正确的文件类型更改png)会发生什么情况) ? 那有用吗? 图片在我的浏览器中打开时显示为损坏。我假设这意味着 base 64 字符串是无效的。 如果你正确添加了 base64 字符串:<img src="data:image/png;base64,the-bade64-string" /> 那么是的。 【参考方案1】:

尝试在浏览器中内嵌显示图像,如下所示:

<img src="data:image/png;base64,the-base64-string" />

(将png改成正确的图片格式)

如果图像仍然损坏,则图像数据无效。

【讨论】:

【参考方案2】:

您可以像这样从 base64 解码图像:

function base64_to_jpeg_img($base64_img_string, $output_img) 
    $input_file_open = fopen($output_img, "wb"); 

    $data = explode(',', $base64_img_string);
    fwrite($input_file_open, base64_decode($data[1])); 
    fclose($input_file_open); 

    return $output_img; 

希望这会有所帮助!

【讨论】:

他写道,data:image/png;base64 等已经从 bas64 字符串中剥离(这基本上是你的爆炸试图做的)。

以上是关于如何在 PHP 中将图像从 base 64 转换为它们的文件类型?的主要内容,如果未能解决你的问题,请参考以下文章

在节点中将 svg 图像从 url 转换为 base64

在节点中将 svg 图像从 url 转换为 base64

如何在 Scriptable App 中将 Base64 转换为图像

如何在obj-c中将图像转换为base64 [重复]

在本机反应中将图像转换为base64

如何在 react-dropzone 中将图像转换为 base64?