将图像文件转换回其原始二进制文件
本文关键字:原始 二进制文件 转换 图像 文件 | 更新日期: 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
和每个像素表示的四个字节之间进行转换。数据将已以字节形式呈现给您。主要的缺点是你必须担心步幅(但这并不难)。