【问题标题】:How to get bmp image from from binary blob data with php如何使用php从二进制blob数据中获取bmp图像
【发布时间】:2015-09-10 21:40:02
【问题描述】:

我尝试了 2 天来找到一种从数据库中检索一些图像的方法。它们被保存为二进制字符串(我在某处读过这个词,但坦率地说,以前从未听说过)。

大部分图片都是.jpeg 格式,很容易获取并保存到文件中。但我的问题是.bmp 图像。由于某种原因,我无法显示。

目前,我正在使用一个简单的代码来获取图像并将其保存到文件中:

$img = $row['image'];
file_put_contents("file.jpeg", $img); //Doesn't matter what format i put there.

.jpeg.png 中工作正常,但.bmp 格式在我尝试显示时无法读取。

我已经找到但没有解决的问题:

原因:两者都尝试转换图像,但某些部分丢失,变黑。

顺便说一句,我不确定这是否会影响问题,但在我的项目中我使用这个库https://github.com/Intervention/image,只有这样我才能看到图像的“半转换”。使用file_put_contents() 它仍然无法读取。所以我的实际代码是这样的:

$img = Image::make(imagecreatefrombmpstring($item['image']));

$filename = __DIR__ . '/test.jpeg';
$img->save($filename);

编辑:

我在下面这个解决方案之前使用过检查我拥有的图像是否为.bmp

PHP : binary image data, checking the image type

他们是。我可以轻松地调整它并更正我的文件输出格式,但这不是我真正的问题。我的问题是 .bmp 文件由于某种原因没有显示。

【问题讨论】:

  • 如果二进制日期是 BMP 格式,并且您将 file_put_contents 直接写入磁盘,那么您直接查看文件——它已损坏——那么唯一的答案是原始二进制数据不在BMP 格式。在您声称的保存到磁盘的 BMP 上运行 file 并查看它的内容。
  • 您不能只混合图像类型。您需要将二进制数据的格式存储在数据库中并相应地使用该格式。
  • @bishop 我确定它们是 bmp 图像,我在我提到的链接中找到的 2 个代码在开始转换之前进行检查。
  • @DanFromGermany 对不起,存储图像的原始代码不是我的,我无法访问它,它不是 php。如果我只有一种安全的方式来读取这个二进制数据(包括 bmp 文件),那就太棒了。我确定有人已经遇到这个问题并且知道如何解决它。
  • 会不会是数据库的列数有限,没有保存完整的bmp?就像,4 MB Jpeg 可以像 bmp 中的 30 MB。一个标准 blob 只能容纳 65535 个字节。您需要MEDIUMBLOBLONGBLOB

标签: php sql image blob bmp


【解决方案1】:

问题是BLOB 限制为 65535 字节。

位图大约是压缩图像大小的 4-8 倍,很可能需要更多空间才能放入数据库。

我建议将列更改为LONGBLOB 或至少MEDIUMBLOB

您也不需要来自 github 的库,如果图像已完全存储,您可以像使用 png 或 jpeg 一样使用file_put_contents()(这是二进制安全的,是的!)。

【讨论】:

  • 再次感谢!使用 strlen() 计算字节数,我发现所有字符串都以 64512 字节停止。该问题的解决方案可以在这里找到stackoverflow.com/questions/5635036/…
  • 我正在使用这个库,因为我想重新调整图像的尺寸,而且它已经在项目的其他地方使用。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多