在Ruby中从二进制数据创建图像文件

3

我可以访问文件的二进制数据,并将其存储在变量中,像这样:

s = File.binread("sample_22122015_03.jpg")
bits = s.unpack("B*")[0]

其中bits的数据是像这样的“101001001010100100.......”

然而,我想做一些更改并将二进制数据再次写回到新图像中,但我无法做到。

我正在使用

File.open('shipping_label_new.jpg', 'wb') do|f|
f.write(Base64.decode64(bits))
end

但是它无法正常运行,我发现图像已损坏。
2个回答

3

试用这段代码

s = File.binread("test_img.jpg")
bits = s.unpack("B*")

File.open('new_test_img.jpg', 'wb') do|f|
  f.write(bits.pack("B*"))
end

1

String.unpack 的反向操作是 Array.pack

 :007 > bits = 'abc'.unpack("B*")
 => ["011000010110001001100011"]
 :008 > bits.pack("B*")
 => "abc"

嗨,Keith,谢谢你的回复。那么我该如何创建二进制数据的图像? - opensource-developer
你的代码其余部分是正确的,你以'wb'模式打开文件并将数据写入其中。数据将以字符串形式呈现。 - Keith Bennett
你好,Keith,我不能直接用0和1创建文件,是吗?我们需要重新打包吗? - opensource-developer
1
没错。这很有道理,不是吗?您可以更改数据,但需要在保存时将其恢复为原始格式。它必须按图像规范指定的格式进行。0和1作为字节将非常不同。 - Keith Bennett
很好的观点,Keith。@opensource-ios,你说你愿意改变从JPEG图像中提取的“位”字符串中的数据,我假设你对JPEG文件格式的构造非常熟悉。在位级别上更改JPEG的数据是一项非常专业的任务,需要将嵌套的一系列结构映射到该位数据并完美地调整数据。因此,当你说,“我看到图像损坏了”,即使你正确保存了数据,你确定已经更改了正确的数据吗? - William Daniel
@WilliamDaniel OP已经使用了unpack函数对数据进行反序列化,但是用decode64函数来重新序列化它。即使数据没有被改动,重新序列化的数据也会和原始数据不同。非常好的指出了修改这个二进制数据的细腻性的观点,我也在想这个问题。 - Keith Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接