1

比较我保存到数据库的图像没有什么不同的最佳方法是什么,从而节省了 I/O。

设想:

我使用实体框架在 MVC3 中编写 ASP.NET 应用程序。我的 UserProfile 控制器有一个Edit操作方法。现在我想检查我发回该方法的图像是否不同,如果是,那么我想调用 ObjectContext 。SaveChanges()如果它是相同的图像,然后继续。

这是我的代码的精简版本:

    [HttpPost, ActionName("Edit")]
    public ActionResult Edit(UserProfile userprofile, HttpPostedFileBase imageLoad2)
    {
        Medium profileImage = new Medium();

        if (ModelState.IsValid)
        {
            try
            {
                if (imageLoad2 != null)
                {
                    if ((db.Media.Count(i => i.Unique_Key == userprofile.Unique_Key)) > 0)
                    {
                        profileImage = db.Media.SingleOrDefault(i => i.Unique_Key == userprofile.Unique_Key);
                        profileImage.Amend_Date = DateTime.Now;
                        profileImage.Source = Images.ImageToBinary(imageLoad2.InputStream);
                        profileImage.File_Size = imageLoad2.ContentLength;
                        profileImage.File_Name = imageLoad2.FileName;
                        profileImage.Content_Type = imageLoad2.ContentType;
                        profileImage.Height = Images.FromStreamHeight(imageLoad2.InputStream);
                        profileImage.Width = Images.FromStreamWidth(imageLoad2.InputStream);

                        db.ObjectStateManager.ChangeObjectState(profileImage, EntityState.Modified);
                        db.SaveChanges();

                    }
                }
            }
        }

所以我将我的图像作为 varbinary(max) 保存到一个 SQL Server Express DB 中,它在我的实体中被引用为一个字节数组。

这只是从帖子中循环字节数组并将其与拉回 ObjectContext 的字节数组进行比较的情况吗?

4

1 回答 1

3

我不会直接比较字节数组,而是比较图像的哈希值。也许可以将以下内容提取到比较方法中:

SHA256Managed sha = new SHA256Managed();
byte[] imgHash1 = sha.ComputeHash(imgBytes1);
byte[] imgHash2 = sha.ComputeHash(imgBytes2);

// compare the hashes
for (int i = 0; i < imgHash1.Length && i < imgHash2.Length; i++)
{
    //found a non-match, exit the loop
    if (!(imgHash1[i] == imgHash2[i]))
        return false;
}
return true;
于 2012-05-14T18:49:44.960 回答