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

本文关键字:原始 二进制文件 转换 图像 文件 | 更新日期: 2023-09-27 18:35:57

这是对之前发布在这里的问题的引用

将二进制文件表示为图像表示

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

我想知道如何逆转该过程,将该位图图像转换回其原始二进制文件?

只把图像变成了一个字节数组,但我不确定我应该如何进一步进行

甚至可能吗?

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

如果我正确理解这个问题,你有一个位图(在内存中,存储在文件中,无论如何),像素数据是从某个任意二进制源生成的,根据你提供的链接中给出的答案。并且您要解码此像素数据,以检索原始二进制数据。

如果是这样,那么下面的方法将做你想要的(我试图尽可能遵守原始答案的约定和结构):

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