我正在尝试验证以 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
) 时,您将再次获得完全相同的数据块,因此我不希望出现差异。
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消