微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用php将二进制数据转换为图像

这个问题已经在这里有了答案:            >            Coverting Hex to Image in PHP?                                    2个
我将二进制图像数据保存在我的旧数据库中,由我的旧开发人员保存,现在我想使用PHP显示图像中的图像,但是我不能.

我尝试过imagecreatefromstring,但返回FALSE.

二进制示例数据:http://freezinfo.com/gg.php

解决方法:

给定显示为文本的字符串(extactly this sequence),它是十六进制数字的组合.

在Jpeg中,此类文件的幻数是前两个字节为FF D8,后两个字节为FF D9(与How to identify contents of a byte[] is a jpeg?比较).

这些十六进制(简写为十六进制)数字也可以在序列的开头和结尾找到:

FF00D800FF00 ... 1F00FF00D9000
##  ##               ##  ##

查找这些魔术数字还表明,十六进制值始终附加为00.它还显示在最后找到一个额外的单0.

因此,四个字符始终形成一个值.十六进制编码,看起来像16位值,但是该值永远不会超过8位范围(0-255),因此总是可见00.

仅凭此信息,然后就可以尝试将其转换为PHP的imagecreatefromstring可以处理的二进制字符串:

$string = implode('',         // map array of binary strings to binary string
    array_map('chr',          // map ord integer value to character
        unpack('v*',          // unsigned short (always 16 bit, little endian byte order)
            pack("H*", $data) // hex to binary (high nibble first)
)));

然后使用这样的字符串

$result = imagecreatefromstring($string);
imagejpeg($result, 'test.jpg');

揭示以下PHP错误通知

imagecreatefromstring(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: bad Huffman code

和下图:

这看起来拼命碎了.因此,您可能在此处面临其他编码问题.最后一个NUL字节表明已完成了更多工作,并且还必须有一个原因,为什么数据已存储为16位十六进制值而不是二进制数据(blob),因为数据库对此有所支持.

但是不要浪费太多时间,因为过去使用的软件和配置存在缺陷,这可能只是数据丢失,因此您所能做的就是从备份中还原.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐