这是对此处发布的上一个问题的引用
Representing binary file as image representation
根据Matthew给出的解决方案,我能够产生结果。
我想知道如何反转这个过程,将该位图图像转换回原来的二进制文件?
我只能将图像转换为字节数组,但我不确定如何继续进行
甚至可能吗?
答案 0 :(得分:0)
如果我正确地理解了这个问题,你会得到一个位图(在内存中,存储在一个文件中,无论如何),其中像素数据是从某个任意二进制源生成的,根据你在链接中给出的答案提供。并且您想要解码此像素数据,以检索原始二进制数据。
如果是这样,那么下面的方法就会做你想要的(我尽可能地坚持原始答案的惯例和结构):
private static byte[] DecodeBinaryFromBitmap(Stream inputStream)
{
using (Bitmap bitmap = (Bitmap)Image.FromStream(inputStream))
{
int length = bitmap.GetPixel(0, 0).ToArgb();
byte[] buffer = new byte[length];
int x = 1, y = 0;
for (var offset = 0; offset < buffer.Length; offset += 4)
{
var colorValue = bitmap.GetPixel(x, y);
byte[] pixelBuffer = BitConverter.GetBytes(colorValue.ToArgb());
Array.Copy(pixelBuffer, 0, buffer, offset, Math.Min(4, buffer.Length - offset));
x++;
if (x >= bitmap.Width)
{
x = 0;
y++;
}
}
return buffer;
}
}
这假设您在另一个问题中使用ARGB版本的编码例程。您传递表示位图数据的Stream
对象。这可能是您从磁盘上的文件打开的FileStream
,或者是从资源或数据库或其他适当的MemoryStream
检索到的Stream
你拥有的对象。
我本来打算使用LockBits()
方法显示位图的原始字节数据并从中进行解码,因为SetPixel()
和GetPixel()
是出了名的慢。但我用1MB随机二进制数据流测试了这一点,在我的计算机上完成只需要大约四分之一秒。我想如果您尝试使用非常大的数据(例如大约1GB)来尝试这样做,那么您可能会考虑采用更快的方法。但是如果你最多处理10兆兆字节(即几秒钟的处理)并且不经常这样做,那么上面应该没问题。
如果您需要更快,那么您应该应用基本技术,但使用LockBits()
来获取位图数据,而不是为每个像素调用GetPixel()
。从好的方面来说,这实际上会使代码更简单,因为您不需要在ARGB int
和每个像素所代表的四个字节之间进行转换。数据已经以字节形式呈现给您。主要的缺点是你必须担心步伐(但这并不是非常困难)。