将图像文件转换回其原始二进制文件

时间:2015-01-02 04:37:47

标签: c# image winforms bitmap bytearray

这是对此处发布的上一个问题的引用

Representing binary file as image representation

根据Matthew给出的解决方案,我能够产生结果。

我想知道如何反转这个过程,将该位图图像转换回原来的二进制文件?

我只能将图像转换为字节数组,但我不确定如何继续进行

甚至可能吗?

1 个答案:

答案 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和每个像素所代表的四个字节之间进行转换。数据已经以字节形式呈现给您。主要的缺点是你必须担心步伐(但这并不是非常困难)。