来自文件的Image ByteArray与来自url的相同Image Byte Array下载不匹配

时间:2014-04-24 22:18:01

标签: c# bitmap compare bytearray webclient

我真的希望有人能指出我正确的方向,因为我把头发的最后一点拉出来了!

我正在做什么:我正在进行图片比较项目,我从网址下载图片并将其与之前存储在我的驱动器上的图片进行比较。如果网址图像与文件图像不同,则会创建一个新文件(然后该图像用于与从网址下载的最新图像进行比较)。

  • 下载的图像使用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)

我有什么遗失的东西吗?

任何建议都将不胜感激!但请,没有第三方工具建议

2 个答案:

答案 0 :(得分:0)

您正在从位图保存下载的图像,这意味着您正在重新编码它,因为图像不同。

如果您希望它们相等,则保存原始数组而不进行处理。

另外,比较已编码的图像字节不是一个好主意,如果您想要的是比较像素数据而不是编码数据(png和位图可以表示完全相同的图像,但编码的数组将完全不同)

如果你想比较像素数据,那么你可以加载两个位图,使用LockBits然后比较像素数据。

答案 1 :(得分:0)

如果有人对比较两个位图感兴趣,这是我从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