| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 648 人关注过本帖
标题:关于图片
只看楼主 加入收藏
渊虹
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-26
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
关于图片
比较出一个文件夹中出现重复的图片
各位大神帮帮忙!!!!!!
搜索更多相关主题的帖子: 图片 
2014-05-27 23:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
名字相同 还是内容相同啊

DO IT YOURSELF !
2014-05-28 08:05
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:7 
程序代码:
/// <summary>
/// 比较两幅图片是否一致(使用Marshal.ReadByte方式)
/// </summary>
/// <param name="bitmap1">图片1</param>
/// <param name="bitmap2">图片2</param>
/// <returns>如果两幅图片相同,返回0;如果图片1小于图片2,返回小于0的值;如果图片1大于图片2,返回大于0的值。</returns>
public static int BitmapCompare3(Bitmap bitmap1, Bitmap bitmap2)
{
  int result = 0; //假设两幅图片相同
  if (bitmap1 == null || bitmap2 == null)
   return -1;
  if (bitmap1.Width == bitmap2.Width && bitmap1.Height == bitmap2.Height)
  {
   BitmapData bmd1 = bitmap1.LockBits(new Rectangle(0, 0, bitmap1.Width, bitmap1.Height), ImageLockMode.ReadOnly, bitmap1.PixelFormat);
   BitmapData bmd2 = bitmap2.LockBits(new Rectangle(0, 0, bitmap2.Width, bitmap2.Height), ImageLockMode.ReadOnly, bitmap2.PixelFormat);
   IntPtr start1 = bmd1.Scan0;
   IntPtr start2 = bmd2.Scan0;
   int sizeOfByte = Marshal.SizeOf(typeof(byte));
   for (int i = 0; i < sizeOfByte * bmd1.Stride * bitmap1.Height; i++)
   {
    byte b1 = Marshal.ReadByte(start1, i);
    byte b2 = Marshal.ReadByte(start2, i);
    if (b1 != b2)
    {
     result = (int)(b1 - b2);
     break;
    }
   }
   bitmap1.UnlockBits(bmd1);
   bitmap2.UnlockBits(bmd2);
  }
  else if (bitmap1.Width != bitmap2.Width)
  {
   result = bitmap1.Width - bitmap2.Width;
  }
  else if (bitmap1.Height != bitmap2.Height)
  {
   result = bitmap1.Height - bitmap2.Height;
  }
  return result;
}
==================================================================================
/// <summary>
/// 用memcmp比较字节数组
/// </summary>
/// <param name="b1">字节数组1</param>
/// <param name="b2">字节数组2</param>
/// <returns>如果两个数组相同,返回0;如果数组1小于数组2,返回小于0的值;如果数组1大于数组2,返回大于0的值。</returns>
public static int MemoryCompare(byte[] b1, byte[] b2)
{
  IntPtr retval = memcmp(b1, b2, new IntPtr(b1.Length));
  return retval.ToInt32();
}
/// <summary>
/// 比较字节数组
/// </summary>
/// <param name="b1">字节数组1</param>
/// <param name="b2">字节数组2</param>
/// <returns>如果两个数组相同,返回0;如果数组1小于数组2,返回小于0的值;如果数组1大于数组2,返回大于0的值。</returns>
public static int MemoryCompare2(byte[] b1, byte[] b2)
{
  int result = 0;
  if (b1.Length != b2.Length)
   result = b1.Length - b2.Length;
  else
  {
   for (int i = 0; i < b1.Length; i++)
   {
    if (b1 != b2)
    {
     result = (int)(b1 - b2);
     break;
    }
   }
  }
  return result;
}
/// <summary>
/// memcmp API
/// </summary>
/// <param name="b1">字节数组1</param>
/// <param name="b2">字节数组2</param>
/// <returns>如果两个数组相同,返回0;如果数组1小于数组2,返回小于0的值;如果数组1大于数组2,返回大于0的值。</returns>
[DllImport("msvcrt.dll")]
private static extern IntPtr memcmp(byte[] b1, byte[] b2, IntPtr count);
========================================================================================================

/// <summary>
/// 比较两幅图片是否一致(使用自定义字节数组比较)
/// </summary>
/// <param name="bitmap1">图片1</param>
/// <param name="bitmap2">图片2</param>
/// <returns>如果两幅图片相同,返回0;如果图片1小于图片2,返回小于0的值;如果图片1大于图片2,返回大于0的值。</returns>
public static int BitmapCompare4(Bitmap bitmap1, Bitmap bitmap2)
{
  int result = 0; //假设两幅图片相同
  if (bitmap1 == null || bitmap2 == null)
   return -1;
  if (bitmap1.Width == bitmap2.Width && bitmap1.Height == bitmap2.Height)
  {
   BitmapData bmd1 = bitmap1.LockBits(new Rectangle(0, 0, bitmap1.Width, bitmap1.Height), ImageLockMode.ReadOnly, bitmap1.PixelFormat);
   BitmapData bmd2 = bitmap2.LockBits(new Rectangle(0, 0, bitmap2.Width, bitmap2.Height), ImageLockMode.ReadOnly, bitmap2.PixelFormat);
   int bytes = bmd1.Stride * bitmap1.Height;
   byte[] buff1 = new byte[bytes];
   byte[] buff2 = new byte[bytes];
   Marshal.Copy(bmd1.Scan0, buff1, 0, Marshal.SizeOf(typeof(byte)) * bytes);
   Marshal.Copy(bmd2.Scan0, buff2, 0, Marshal.SizeOf(typeof(byte)) * bytes);
   result = MemoryCompare2(buff1, buff2);
   bitmap1.UnlockBits(bmd1);
   bitmap2.UnlockBits(bmd2);
  }
  else if (bitmap1.Width != bitmap2.Width)
  {
   result = bitmap1.Width - bitmap2.Width;
  }
  else if (bitmap1.Height != bitmap2.Height)
  {
   result = bitmap1.Height - bitmap2.Height;
  }
  return result;
}==================================================================================
/// <summary>
/// 比较两幅图片是否一致(使用Bitmap.GetPixel方式)
/// </summary>
/// <param name="bitmap1">图片1</param>
/// <param name="bitmap2">图片2</param>
/// <returns>如果两幅图片相同,返回0;如果图片1小于图片2,返回小于0的值;如果图片1大于图片2,返回大于0的值。</returns>
public static int BitmapCompare(Bitmap bitmap1, Bitmap bitmap2)
{
  int result = 0; //假设两幅图片相同
  if (bitmap1 == null || bitmap2 == null)
   return -1;
  if (bitmap1.Width == bitmap2.Width && bitmap1.Height == bitmap2.Height)
  {
   for (int i = 0; i < bitmap1.Width; i++)
   {
    for (int j = 0; j < bitmap1.Height; j++)
    {
     Color color1 = bitmap1.GetPixel(i, j);
     Color color2 = bitmap2.GetPixel(i, j);
     if (color1 != color2)
     {
      result = color1.ToArgb() - color2.ToArgb();
      break;
     }
    }
    if (result != 0)
     break;
   }
  }
  else if (bitmap1.Width != bitmap2.Width)
  {
   result = bitmap1.Width - bitmap2.Width;
  }
  else if (bitmap1.Height != bitmap2.Height)
  {
   result = bitmap1.Height - bitmap2.Height;
  }
  return result;
}
/// <summary>
/// 比较两幅图片是否一致(使用memcmp方式)
/// </summary>
/// <param name="bitmap1">图片1</param>
/// <param name="bitmap2">图片2</param>
/// <returns>如果两幅图片相同,返回0;如果图片1小于图片2,返回小于0的值;如果图片1大于图片2,返回大于0的值。</returns>
public static int BitmapCompare2(Bitmap bitmap1, Bitmap bitmap2)
{
  int result = 0; //假设两幅图片相同
  if (bitmap1 == null || bitmap2 == null)
   return -1;
  if (bitmap1.Width == bitmap2.Width && bitmap1.Height == bitmap2.Height)
  {
   BitmapData bmd1 = bitmap1.LockBits(new Rectangle(0, 0, bitmap1.Width, bitmap1.Height), ImageLockMode.ReadOnly, bitmap1.PixelFormat);
   BitmapData bmd2 = bitmap2.LockBits(new Rectangle(0, 0, bitmap2.Width, bitmap2.Height), ImageLockMode.ReadOnly, bitmap2.PixelFormat);
   int bytes = bmd1.Stride * bitmap1.Height;
   byte[] buff1 = new byte[bytes];
   byte[] buff2 = new byte[bytes];
   Marshal.Copy(bmd1.Scan0, buff1, 0, Marshal.SizeOf(typeof(byte)) * bytes);
   Marshal.Copy(bmd2.Scan0, buff2, 0, Marshal.SizeOf(typeof(byte)) * bytes);
   result = MemoryCompare(buff1, buff2);
   bitmap1.UnlockBits(bmd1);
   bitmap2.UnlockBits(bmd2);
  }
  else if (bitmap1.Width != bitmap2.Width)
  {
   result = bitmap1.Width - bitmap2.Width;
  }
  else if (bitmap1.Height != bitmap2.Height)
  {
   result = bitmap1.Height - bitmap2.Height;
  }
  return result;

}

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2014-05-28 08:29
freeforever
Rank: 4
等 级:业余侠客
威 望:3
帖 子:368
专家分:201
注 册:2005-11-2
收藏
得分:7 
同一文件夹就不会是同名的,应该是指的图片内容,恰好以前写过一个类似的小东西,说下思路给你,可能对你的需求有用:

我当时做的是PDF碎片的合并,多个小PDF之间的重复的页面,每个PDF打散成图后尺寸各异,需要去除掉内容相同的页。

处理方法是指定一个Rectangle,把每个导出的图片二值化处理,在内存中转换为Rectangle大小,把这个Rectangle分成m*n块,对应一个二维数组,每小块对应黑色数超过白色时为1,否则记为0。如此处理后比较两个二维数组值相同的个数占总的百分比来确定内容是否一样。因为即使PDF碎片但页面内容是连续的,所以只要比较相邻两个碎片首发页是否相似就可以了。这个方法的关键点是分块的大小,两个二维数组比较结果判定,。我用这种方法成功解决了大量碎片文档的合并,正确率在97%以上。

而你要处理的是没有相关性的图片,首先按文件大小和尺寸排序,两者都相同的就可能是同样内容(位图除外),剩下尺寸不一的图试试上面描述的方法。


其实我也很无聊!
2014-05-28 08:34
渊虹
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-26
收藏
得分:0 
回复 2 楼 wp231957
图片的内容
2014-05-29 00:40
渊虹
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-26
收藏
得分:0 
回复 4 楼 freeforever
非常感谢你提出的思路
2014-05-29 01:38
渊虹
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2014-5-26
收藏
得分:0 
回复 3 楼 wangnannan
2014-05-29 01:39
快速回复:关于图片
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019351 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved