文件中的Image ByteArray与从url下载的相同Image ByteArray不匹配
本文关键字:ByteArray Image 不匹配 下载 与从 文件 url | 更新日期: 2023-09-27 18:00:14
我真的希望有人能在我拔出最后一根头发的时候给我指明正确的方向!
我在做什么:我正在进行一个图像比较项目,从url下载图像,并将其与以前存储在驱动器上的图像进行比较。如果url图像与文件中的图像不同,则会创建一个新文件(然后该图像用于与从url下载的最新图像进行比较)。
- 下载的图像使用MemoryStream和Bitmap。FromStream(ms)创建图像(使用WebClient DownloadData)-工作非常完美
- 通过将图像转换为字节数组并使用file将其存储在文件中。WriteAllBytes-运行良好
因此,我能够成功地下载、保存和读取图像。
这是我的问题:下载的图像的字节数超过了存储在文件中的原始图像的字节,这使得我的图像比较方法变得毫无用处。
两个图像完全相同,在视觉上也完全相同。分辨率、格式、像素格式都相同,但字节不匹配,我不知道为什么?
byte[] byteNew.Length = {byte[28468]} //(From Url)
byte[] byteOld.Length = {byte[28335]} //(From File - but file length in notepad is 28468)
我有什么东西不见了吗?
如有任何建议,我们将不胜感激!但请不要使用第三方工具建议
您将从位图中保存下载的图像,这意味着您正在对其进行重新编码,因为图像不同。
如果希望它们相等,则保存原始数组而不进行处理。
此外,如果你想比较的是像素数据而不是编码数据,那么比较已经编码的图像字节不是一个好主意(png和位图可以代表完全相同的图像,但编码的数组将完全不同)
如果要比较像素数据,则可以加载两个位图,使用LockBits,然后比较像素数据。
如果有人对比较两个位图感兴趣,下面是Gussman关于使用LockBits的评论。
下面是MSDN从位图返回像素数据的示例的压缩版本。。。其然后可以用于比较或图像操作。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace Example
{
public class ImageData
{
public static byte[] BytesFromImage(Image image)
{
//Parse the image to a bitmap
Bitmap bmp = new Bitmap(image);
// Set the area we're interested in and retrieve the bitmap data
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
// Create a byte array from the bitmap data
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
byte[] rgbValues = new byte[bytes];
IntPtr ptr = bmpData.Scan0;
Marshal.Copy(ptr, rgbValues, 0, bytes);
bmp.UnlockBits(bmpData);
//return the byte array
return rgbValues;
}
}
}
更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/5ey6h79d(v=vs.110).aspx