2

我有以下代码将图像(位图)转换为字节数组:

public byte[] ConvertImageToByteArray(Image imageToConvert, ImageFormat formatOfImage)
{
    byte[] Ret;
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            imageToConvert.Save(ms, formatOfImage);
            Ret = ms.ToArray();
        }
    }
    catch (Exception) 
    { 
        throw;
    }

    return Ret;
}

并将字节数组转换回图像(位图):

public Bitmap ConvertByteArrayToImage(byte[] myByteArray)
{
    Image newImage;

    using (MemoryStream ms = new MemoryStream(myByteArray, 0, myByteArray.Length))
    {
        ms.Write(myByteArray, 0, myByteArray.Length);
        newImage = Image.FromStream(ms, true);
    }
    return newImage;
 }

这是我的主程序:

    byte[] test = ConvertImageToByteArray(Image.FromFile("oldImage.bmp"), ImageFormat.Bmp);

    Bitmap bmp = ConvertByteArrayToImage(test);
    bmp.Save("newImage.bmp");

但是当我比较两个图像文件(新旧位图图像)时,它们的校验和似乎不同。发生这种情况有什么原因吗?如何修复它以保持其完整性?

4

2 回答 2

2

基本上,有很多方法可以将相同的图像编码到 BMP 文件中。如果我在找到的随机图像上尝试您的示例,我看到 .NETBitmap类保存文件而不填充BMP 标头biSizeImage中结构中的字段BITMAPINFOHEADER(但由 IrfanView 生成的原始图像已填充),这是完全正确的并记录在案的可能性。(“对于 BI_RGB 位图,这可能设置为零。”)

这绝对不是 BMP 格式中唯一可变的东西。例如,图像中有多种可能的像素数据顺序(从上到下,从下到上),在标题中指定。(“如果 biHeight 为正,则位图为自下而上的 DIB,其原点为左下角。如果 biHeight 为负,则位图为自上而下的 DIB,其原点为左上角。”)

因此,如果您从不受您控制的源接收任何 BMP 文件并且确实需要使用完全相同的 BMP 变体生成图像,那么您有很多工作要做,而且我认为您不能使用标准的 .NET帮助类。

另请参阅此问题:Save bitmap to file has zero in image size field

于 2012-10-25T09:33:50.680 回答
1

聊了一会儿,您的解决方案归结为读取和写入字节,将图像对象从方程式中取出并处理原始字节。

要读取文件:

    MemoryStream ms = new MemoryStream(File.ReadAllBytes("filename"));

要写入文件:

    File.WriteAllBytes("outputfile", ms.ToArray());
于 2012-10-25T09:54:28.837 回答