Rails 二进制流转换为图片

glorySpring · 2013年06月04日 · 最后由 glorySpring 回复于 2013年06月21日 · 15872 次阅读

最近遇到一个这样的需求,读取手机通讯录里面的数据,如果有图片(头像-->这里读取出来是二进制数据流)就把它转换为本地的图片,然后再存储到数据库中。

有没有转换二进制数据流为图片的办法呢?

是 ios 端给传来的数据 格式如下: <89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000 00f6d6d4 d9000000 1c69444f 54000000 02000000 00000001 05000000 28000001 05000001 04000185 9f9cfe3e 80000040 00494441 547801ec 9d076055 d5fdc703

这个只是很小一部分。所以 我有点晕了。

给个大腿抱。。。。。谢谢大家。

data = stream.read 写到文件或者数据库都随意...

直接写入文件就行了,读出来的应该就是图像格式的了。具体是什么格式可以查文档,或者用 file 命令猜下 图片就是二进制流,二进制流有可能是图片格式。所以“二进制数据流转换为图片”,其实也是二进制流转换成二进制流,只是格式不同而已。如果已经是图像格式,那就不需要转换

如果不需要二次编辑(裁剪 格式化大小)什么的 直接写文件应该就可以了 如果需要二次编辑 用 mini_magick 即可

#1 楼 @luikore #2 楼 @reus #3 楼 @zj0713001

谢谢,三位的解答.....是我有点犯糊涂了..呵呵,感谢帮帮助。

<89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000

#3 楼 @zj0713001 #2 楼 @reus #1 楼 @luikore

<89504e47 0d0a1a0a 0000000d 49484452 00000258 00000209 08020000

格式是这个样子的数据....用了几种方法 还是不能 转换为本地的图片..麻烦给位了...

写入本地文件,然后用 file 命令

#7 楼 @reus 能求一个例子嘛?我写入本地文件 ,本地确实创建了,然后打不开...格式不正确...

#6 楼 @glorySpring 文件打开就是带空格的么...

#9 楼 @zj0713001 是啊... 带空格的。

#9 楼 @zj0713001 是啊,从 ios 客户端给我的数据,就这么一堆二进制的码,然后...我就不知道怎么处理了。

#11 楼 @glorySpring 我的第一反应 这不是图片的二进制数据啊 最起码太短了 ios 的联系人图像是 NSData 吧(google 的)能不能转成 byte 数组给你?试试吧...我也不会...

#12 楼 @zj0713001 哦 不是太短了,是只是一部分,拿过来的话 实在太多了...是用 NSData 传过来的...嗯,我问一下吧...估计悬点。

如果这个图片只是这个 app 用的话直接存 NSData 的数据就好,不是的话只能让 app 传图片的流文件过来

用 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

#13 楼 @glorySpring 还是楼上几位大神牛 目测可行

#18 楼 @glorySpring 怎么解决的呢,还是没有看懂

#19 楼 @zj0713001 恩恩,很厉害,这几个方法我都没看过...汗了. #20 楼 @lijinjin230 就是按照 @skandhas@reus 所说的方法啊...这代码已经写出来了。

#20 楼 @lijinjin230 我不太清楚你接收到的格式不是不跟我的一样,一样的话 那就是按照上边两位的任何一个办法都可以解决,就是把接收到的数据 (我转换为字符串了) 给处理一下,去掉 NSData 发过来自带的"<>",以及 空格,然后写入文件就可以了。

realwol [着急] Ruby 或 Rails 如何将二进制转化为图片 提及了此话题。 09月30日 10:18
需要 登录 后方可回复, 如果你还没有账号请 注册新账号