当前位置:编程学习 > C#/ASP.NET >>

怎样判断两张图片是否相等???

要做图片的替换,如果是同一张图片则替换成另一张。

请给个具体代码,谢谢? --------------------编程问答-------------------- 用二进流的形式读取图片文件,然后比较两个流是或一样. --------------------编程问答--------------------

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        DataRow dr;
        dr = dt.NewRow();
        byte[] temp1 = getImage("d://1.jpg");
        byte[] temp2 = getImage("d://2.jpg");
        bool isEqual = true;
        //判断图片是否相等
        if (temp1.Length == temp2.Length)
        {
            for (int i = 0; i < temp1.Length; i++)
            {
                if (temp1[i] != temp2[i])
                {
                    isEqual = false;
                }
            }
        }
        else
        {
            isEqual = false;
        }
        if (isEqual)
        {
            Response.Write("<script>alert('两图片相等')</script>");
        }
        else
        {
            Response.Write("<script>alert('两图片不相等')</script>");
        }
    }
    /// <summary>
    /// 按图片路径把图片打成二进制流
    /// </summary>
    /// <param name="path">图片路径</param>
    /// <returns></returns>
    public byte[] getImage(string path)
    {
        FileStream fs = File.OpenRead(path);
        MemoryStream ms = new MemoryStream();
        int bdata;
        while ((bdata = fs.ReadByte()) != -1)
        {
            ms.WriteByte(((byte)bdata));
        }
        byte[] data = (byte[])ms.ToArray();
        fs.Close();
        ms.Close();
        fs = null;
        ms = null;
        return data;
    }
}



--------------------编程问答-------------------- 用直方图统计吧,这样即使稍有些细节差异(包括等比例缩放......),也可以容错,不过也有一定的概率误判。 --------------------编程问答-------------------- 如果要判断是否完全相同,可以使用图片的Hash值来作判断。 --------------------编程问答-------------------- 学习了 --------------------编程问答--------------------
引用 2 楼 peter200694013 的回复:
C# code

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebCon……


up --------------------编程问答-------------------- 不知道lz需要的完全相等是什么概念上的。
如果是绝对的完全相等,那么只有两个完全相同的文件才可能做到完全相等,用上面的方法都可以做到。

如果只是用肉眼看起来很难(几乎不能)找到差异,那么对两幅图片求差,判断差的绝对值是否小于某一阈值即可做到比较。
--------------------编程问答-------------------- 同意4#的。 --------------------编程问答-------------------- 每张图片算个MD5码即可.

            MD5 md5 = MD5.Create();
            FileStream inFile = new FileStream(imgFile, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[inFile.Length];
            inFile.Read(buffer, 0, inFile.Length);
            md5.ComputeHash(buffer);

--------------------编程问答--------------------
引用 2 楼 peter200694013 的回复:
C# code

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebCon……

不是要根据路径获取图片,而是要判断两个pictureBox里的图片是否是同一图片,知道的给个代码,谢谢 --------------------编程问答-------------------- 以文件路径来判断你要处理的图片是否存在。 --------------------编程问答--------------------
引用 10 楼 kucao0707 的回复:
不是要根据路径获取图片,而是要判断两个pictureBox里的图片是否是同一图片,知道的给个代码,谢谢


举一反三…

提供2种方式你自己选择,都行。


//图片序列化为流后对比
public static bool IsSameImage(Image a, Image b)
{
    MemoryStream m1 = new MemoryStream();
    MemoryStream m2 = new MemoryStream();
    a.Save(m1, a.RawFormat);
    b.Save(m2, b.RawFormat);
    if (m1.Length != m2.Length) return false;//长度都不等了
    for (int i = 0; i < m1.Length; i++)
    {
        if (m1.ReadByte() != m2.ReadByte()) return false;//找到不同的了
    }
    return true;//相同
}

//像素对比
public static bool IsSameImage1(Image a, Image b)
{
    if (a.Width != b.Width || a.Height != b.Height) return false;
    Bitmap p1 = a as Bitmap;
    Bitmap p2 = b as Bitmap;
    for (int x = 0; x < a.Width; x++)
    {
        for (int y = 0; y < a.Height; y++)
        {
            if (p1.GetPixel(x, y) != p2.GetPixel(x, y)) return false;
        }
    }
    return true;
}
--------------------编程问答-------------------- --------------------编程问答-------------------- 这个网站的控件可能能帮助你。

网站





my blog
http://ufo-crackerx.blog.163.com/ --------------------编程问答-------------------- 关注学习 --------------------编程问答-------------------- 读成二进制流比较就可以了.. --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 图片是否相等的命题楼主给的不清楚。
如果是大家来找茬这样的东西,需要金字塔法。
如果只是单纯判断是不是绝对相同,那就把picturebox加载的image对象转换成bitmap然后通过bitmapdata一个一个比较像素。 --------------------编程问答-------------------- 比较hash值 --------------------编程问答-------------------- 我采用了你的第一种方法,出现了一个奇怪的问题,ReadByte()读取出来的值全部都是“-1”,如果在读取前加这句“Image.FromStream(m1);”,就能读到正确的值,这是为什么?怎么感觉跟激活了一下似的。


引用 12 楼 wuyazhe 的回复:
引用 10 楼 kucao0707 的回复:
不是要根据路径获取图片,而是要判断两个pictureBox里的图片是否是同一图片,知道的给个代码,谢谢

举一反三…

提供2种方式你自己选择,都行。


C# code

//图片序列化为流后对比
public static bool IsSameImage(Image a, Image b)
{
    MemoryStr……
--------------------编程问答--------------------
引用 7 楼 aimeast 的回复:
不知道lz需要的完全相等是什么概念上的。
如果是绝对的完全相等,那么只有两个完全相同的文件才可能做到完全相等,用上面的方法都可以做到。

如果只是用肉眼看起来很难(几乎不能)找到差异,那么对两幅图片求差,判断差的绝对值是否小于某一阈值即可做到比较。

确实如此,楼主首先应该明确“完全相等”的定义。 --------------------编程问答-------------------- 这个贴子2010年的了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,