为了账号安全,请及时绑定邮箱和手机立即绑定

System.Drawing.Image Save 的输出与输入 Image.FromStream

System.Drawing.Image Save 的输出与输入 Image.FromStream

C#
慕尼黑8549860 2023-07-09 17:38:15
我正在尝试验证以 Base64 字符串格式提交到后端的图像,方法是将其解析为 Image 对象,从同一 Image 对象中提取它,最后比较输入字节数组和输出字节数组,假设这两个应该相同或有一些东西输入图像错误。这是代码:    private void UpdatePhoto(string photoBase64)     {        var imageDataInBytes = Convert.FromBase64String(photoBase64);        ValidateImageContent(imageDataInBytes);    }    private void ValidateImageContent(byte[] imageDataInBytes)    {        using (var inputMem = new MemoryStream(imageDataInBytes))        {            var img = Image.FromStream(inputMem, false, true);            using (MemoryStream outputMemStream = new MemoryStream())            {                img.Save(outputMemStream, img.RawFormat);                var outputSerialized = outputMemStream.ToArray();                if (!outputSerialized.SequenceEqual(imageDataInBytes))                    throw new Exception("Invalid image. Identified extra data in the input. Please upload another photo.");            }        }    }它在我知道是有效的图像上失败了。我的假设是否错误,即 Image.Save 的输出必须与 Image.FromStream 的输出相同?有没有办法纠正这个逻辑以正确实现这种验证方式?
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

如果将原始图像与创建的图像进行比较,您会注意到元数据中的一些差异:对于我的示例图像,我可以观察到一些元数据被剥离(XMP 数据被完全删除)。此外,虽然保留了 EXIF 数据,但写入的字节序却从小字节序反转为大字节序。仅此一点就解释了为什么数据不匹配。

在我的示例中,实际的图像数据是相同的,但仅通过查看字节无法轻松辨别。

如果您想生成与源相同的结果,则必须以与源完全相同的方式生成元数据。不过,如果不仔细查看原始照片的元数据,您将无法做到这一点。.NETImage根本无法包含文件可能包含的所有元数据。即使您能够提取所有元数据并再次以正确的格式存储它,元数据序列化器之间也存在许多细微差别,这使得产生完全相同的结果非常困难。

因此,如果您想比较图像,您可能应该剥离元数据并只比较图像数据。但是,当您考虑如何保存图像 ( Raw) 时,您将再次获得完全相同的数据块,因此我不希望出现差异。


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信