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

C# 将图像文件转换回其原始二进制文件,c#,image,winforms,bitmap,bytearray,C#,Image,Winforms,Bitmap,Bytearray,这是对上一个问题的引用 根据马修给出的解决方案,我能够得出结果 我想知道如何反转这个过程,将位图图像转换回其原始二进制文件 我只是将图像转换为字节数组,但我不确定应该如何进一步 甚至有可能吗?如果我正确理解了这个问题,那么根据您提供的链接中给出的答案,内存中有一个位图,存储在一个文件中,无论像素数据是从哪个任意二进制源生成的。你需要解码这个像素数据,来检索原始的二进制数据 如果是这样的话,那么下面的方法将满足您的要求,因为我已经尽可能地遵守原始答案的约定和结构: private static b

这是对上一个问题的引用

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

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

我只是将图像转换为字节数组,但我不确定应该如何进一步


甚至有可能吗?

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

如果是这样的话,那么下面的方法将满足您的要求,因为我已经尽可能地遵守原始答案的约定和结构:

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版本的编码例程。传递表示位图数据的流对象。这可能是从磁盘上的文件打开的文件流,或者是从资源或数据库检索的内存流,或者是您拥有的其他适当的流对象

我本来打算展示一个版本,它使用LockBits方法获取位图的原始字节数据并从中解码,因为SetPixel和GetPixel的速度非常慢。但我用1MB的随机二进制数据流进行了测试,只花了大约四分之一秒就在我的计算机上完成了。我猜如果你想用大数据来做这件事,比如按1GB的顺序,那么你可能会考虑更快的方法。但是,如果您最多处理10兆字节,即几秒钟的处理时间,而不必经常这样做,那么上述情况应该可以


如果您需要比这更快的速度,那么您应该应用基本技术,但是使用锁位来获取位图数据,而不是为每个像素调用GetPixel。好的一面是,这实际上会使代码更简单,因为您不需要在ARGB int和每个像素代表的四个字节之间进行转换。数据将以字节的形式呈现给您。主要的缺点是您必须担心步幅,但这并不十分困难。

Hi Koh请查看[此链接][1],我希望这能满足您的要求。[1] :嗨,瓦西斯坦,谢谢你的链接。但我想做的是将位图图像转换回其原始文件。例如,使用我原始问题中发布的给定解决方案,我能够获得calc.exe的位图表示形式。但是现在你怎么把这个位图图像恢复到exe文件?你只需要吗?嗨,dbc,我要找的是有一种方法,用c,把这个字节数组恢复到它的.exe文件。我将exe文件转换为图像。现在,我的目标是将此图像转换回其exe文件