将图像 base64 数据转换成图片文件

最近刚好遇到一个需要将图像 base64 数据转换成文件的功能,为了方便我直接用 chatGPT 生成功能函数就拿来直接用,结果反复测试了几次图片文件无法正常查看。chatGPT 生成的代码如下:



思考问题出在哪儿? 平时使用 file_put_contents() 函数多是用来写日志或缓存文件,它写入文件的数据是字符串、数组或其他可序列化的数据,而实例中的图像 base64 数据 去除文件类型信息后,base64 解码后是二进制数据。

更深层的原因以我现在的知识解决不了。接下来的代码才是能正常使用的。

要使用PHP代码将图像的Base64数据转换为图片文件,您可以使用以下代码示例:

这段代码实现了将Base64编码的图像数据转换为图像文件的功能。以下是代码的步骤解释:

  1. 首先,传入两个参数:$base64Data(Base64编码的图像数据)和$outputFile(输出文件路径)。
  2. 使用str_replace函数去掉$base64Data中的文件类型信息,将'image/jpeg;base64,''image/png;base64,'替换为空字符串,得到纯净的Base64数据。
  3. 使用base64_decode函数将纯净的Base64数据解码为图像数据。
  4. 使用fopen函数创建一个以二进制写入模式打开的文件句柄$file,用于写入图像数据。
  5. 使用fwrite函数将图像数据写入文件。
  6. 使用fclose函数关闭文件句柄。
  7. 成功返回 true, 失败返回 false.

扩展:

图像文件类型信息有哪些?

常见的图像文件类型信息包括:

  • JPEG(.jpg、.jpeg):一种常用的有损压缩格式,适用于存储照片和彩色图像。
  • PNG(.png):一种无损压缩格式,适用于存储图标、透明图像和图形等。
  • GIF(.gif):一种支持动画的图像格式,适用于简单的动画和图形。
  • BMP(.bmp):一种无压缩的图像格式,适用于存储原始图像数据。
  • TIFF(.tiff、.tif):一种多页和高质量图像格式,适用于印刷和出版等领域。
  • SVG(.svg):一种矢量图像格式,适用于网页和可缩放图形。
  • WEBP(.webp):一种谷歌开发的图像格式,具有较高的压缩率和图像质量。
  • ICO(.ico):一种用于存储图标的文件格式,常用于Windows操作系统。
    这只是一些常见的图像文件类型,还有其他少见或特定用途的图像文件类型。

使用 file_put_contents() 将解码后图像的二进制数据写入文件,这样得来的图像文件无法正常查看。使用 fwrite() 写入文件操作后的图片文件是正常的,请分析下原因

如果使用 file_put_contents() 函数将解码后的图像二进制数据直接写入文件,有时候可能会导致无法正常查看的问题。这可能是由于 file_put_contents() 函数默认以文本模式写入数据,导致在写入过程中进行了一些文本处理,从而导致图像数据损坏。

相比之下,使用 fwrite() 函数进行二进制写入操作可以避免这个问题。fwrite() 函数以二进制模式将数据直接写入文件,不会进行额外的文本处理,因此适用于写入图像数据。

以下是使用 fwrite() 函数进行图像数据写入的示例代码:



// 原始的 base64 数据
$base64Data = '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAIAAgADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQ';

// 去掉 base64 数据中的文件类型信息
$base64Data = str_replace('data:image/jpeg;base64,', '', $base64Data);

// 将 base64 数据解码
$imageData = base64_decode($base64Data);

// 检查是否解码成功
if ($imageData !== false) {
  // 写入文件
  $filename = 'image.jpg';
  $fileHandle = fopen($filename, 'wb'); // 以二进制模式打开文件
  if ($fileHandle !== false) {
    fwrite($fileHandle, $imageData);
    fclose($fileHandle);
    echo '文件写入成功!';
  } else {
    echo '无法打开文件!';
  }
} else {
  echo '无法解码 base64 数据!';
}

?>

在这个示例中,我们使用 fopen() 函数以二进制模式打开文件,并将返回的文件句柄传递给 fwrite() 函数进行写入操作。最后,记得使用 fclose() 函数关闭文件句柄。

使用 fwrite() 函数进行二进制写入操作可以确保图像数据不会被误处理,从而生成正常的图像文件。

原文链接: https://baijiahao.baidu.com/builder/preview/s?id=1769990005390742652

你可能感兴趣的:(PHP,php)