图像复制问题使用Ruby File方法each_byte

时间:2013-07-31 20:36:23

标签: ruby image encoding unicode base64

这个问题困扰了我一段时间。

我有一个34.6千字节的jpeg文件。我们称之为Image A.使用Ruby,当我将Image A的每一行复制到一个名为Image B的新创建文件时,它会被完全复制。它与图像A的大小完全相同,可以访问。

以下是我使用的代码:

image_a = File.open('image_a.jpg', 'r')
image_b = File.open('image_b.jpg', 'w+')

image_a.each_line do |l|
  image_b.write(l)
end

image_a.close
image_b.close

此代码生成image_a的完美副本到image_b。

当我尝试将图像A逐个字节地复制到图像B中时,它成功复制,但文件大小为88.9千字节而不是34.6千字节。我无法访问Image B.我的mac系统提醒我它可能已损坏或正在使用无法识别的文件格式。

相关代码:

//same as before
image_a.each_byte do |b|
  image_b.write(b)
end
//same as before

为什么图像B在逐字节复制时大于图像A?为什么它也会以某种方式,形状或形式受损?为什么图像A的大小与B相同,逐行复制并可访问?

我的猜测是问题是编码问题。如果是这样,为什么编码格式在逐字节复制时很重要,如果它们转换为正确的代码点?代码点是否互相混淆,因此解析器无法区分它们?

是否和\ n很重要?看起来好像。我做了一些更多的研究,我发现Image A有128行代码,而Image B只有一行。

感谢阅读!

1 个答案:

答案 0 :(得分:2)

IO#each_byte遍历字节(又称整数)。但是,IO#write以字符串作为参数。因此它通过to_s将整数转换为字符串。

鉴于图像中的第一个字节是255 1 ,您将字符串"255"写入image_b。这就是你的image_b变大的原因。你将数字字符串写入其中。

写回字节时请尝试以下操作:

image_a.each_byte do |l|
  image_b.write l.chr
end

1 正如@stefan所指出的那样,jpeg图像以FF D8开头。所以第一个字节是255