最近遇到一个这样的需求,读取手机通讯录里面的数据,如果有图片(头像-->这里读取出来是二进制数据流)就把它转换为本地的图片,然后再存储到数据库中。
有没有转换二进制数据流为图片的办法呢?
是 ios 端给传来的数据 格式如下: <89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000 00f6d6d4 d9000000 1c69444f 54000000 02000000 00000001 05000000 28000001 05000001 04000185 9f9cfe3e 80000040 00494441 547801ec 9d076055 d5fdc703
这个只是很小一部分。所以 我有点晕了。
给个大腿抱。。。。。谢谢大家。
直接写入文件就行了,读出来的应该就是图像格式的了。具体是什么格式可以查文档,或者用 file 命令猜下 图片就是二进制流,二进制流有可能是图片格式。所以“二进制数据流转换为图片”,其实也是二进制流转换成二进制流,只是格式不同而已。如果已经是图像格式,那就不需要转换
#11 楼 @glorySpring 我的第一反应 这不是图片的二进制数据啊 最起码太短了 ios 的联系人图像是 NSData 吧(google 的)能不能转成 byte 数组给你?试试吧...我也不会...
#12 楼 @zj0713001 哦 不是太短了,是只是一部分,拿过来的话 实在太多了...是用 NSData 传过来的...嗯,我问一下吧...估计悬点。
用 python2 的话,删掉那个字符串里的空格
>>> with open('f', 'w') as f: f.write('89504e470d0a1a0a0000000d49484452000002580000020908020000'.decode('hex'))
然后在终端里输入
file f
就会输出
f: PNG image data, 600 x 521, 8-bit/color RGB,
所以这是 png 格式的图片数据,大小都有了……
with open('t', 'w') as f:
f.write('89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000 00f6d6d4 d9000000 1c69444f 54000000 02000000 00000001 05000000 28000001 05000001 04000185 9f9cfe3e 80000040 00494441 547801ec 9d076055 d5fdc703'.replace(' ', '').decode('hex'))
file t
t: PNG image data, 600 x 521, 8-bit/color RGB, non-interlaced
这数据就是把图片的数据按 Hex Dump 的方式给你了。你需要做的就是把它还原回去。 比如: '89' 要转成 0x89 等等... @reus 的方法是对的。在 Ruby 和 Python 下 处理起来就更简单了。
下面是 Ruby 的示例代码 (数据不包含前面的‘<’ ):
img = '89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000'
File.open('test.png', 'wb') do |f|
f.write [img.gsub(/\s+/, '')].pack('H*')
end
#19 楼 @zj0713001 恩恩,很厉害,这几个方法我都没看过...汗了. #20 楼 @lijinjin230 就是按照 @skandhas 和 @reus 所说的方法啊...这代码已经写出来了。
#20 楼 @lijinjin230 我不太清楚你接收到的格式不是不跟我的一样,一样的话 那就是按照上边两位的任何一个办法都可以解决,就是把接收到的数据 (我转换为字符串了) 给处理一下,去掉 NSData 发过来自带的"<>",以及 空格,然后写入文件就可以了。