gpt4 book ai didi

C# 图片 : To preserve image's checksum

转载 作者:行者123 更新时间:2023-11-30 22:23:56 36 4
gpt4 key购买 nike

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

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");

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

最佳答案

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

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

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

另见这个问题:Save bitmap to file has zero in image size field

关于C# 图片 : To preserve image's checksum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065092/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com