【发布时间】: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 个字节。您需要
MEDIUMBLOB或LONGBLOB。