对比两张图片
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对比两张图片,找出差异的方法
public List<Bitmap> Contrast(Bitmap bmOld, Bitmap bmNew)
{
Color pixel1;
Color pixel2;
List<Point> lstPoint = new List<Point>();//存放两张图片的差异点
List<Point> lstStart = new List<Point>();//每个矩形包含的第一个点
List<Point> lstEnd = new List<Point>();//每个矩形包含的最后一个点
List<Point> lstLeft = new List<Point>();//每个矩形最左边的点
List<Point> lstRight = new List<Point>();//每个矩形最右边的点
List<Bitmap> lstBitmap = new List<Bitmap>();
//找出两张图片的差异点
for (int y = 0; y < bmNew.Height; y ++)
{
for (int x = 0; x < bmNew.Width; x++)
{
pixel1 = bmOld.GetPixel(x, y);
pixel2 = bmNew.GetPixel(x, y);
if (pixel2 != pixel1)
{
lstPoint.Add(new Point(x, y));
}
}
}
//对差异点进行分组,确定每个矩形的高度
lstStart.Add(lstPoint[0]);
if (lstPoint.Count != 0)
{
for (int i = 0; i < lstPoint.Count; i++)
{
for (int j = 0; j < i; j++)
{
if ((i == j + 1) && (lstPoint[i].Y - lstPoint[j].Y > 20))
{
lstStart.Add(lstPoint[i]);
lstEnd.Add(lstPoint[j]);
}
}
}
}
lstEnd.Add(lstPoint[lstPoint.Count - 1]);
//确定每个矩形最左边的点和最右边的点
for (int i = 0; i < lstStart.Count; i++)
{
Point pLeft = new Point();
Point pRight = new Point();
for (int j = 0; j < lstPoint.Count; j++)
{
if (lstPoint[j].Y > lstStart[i].Y && lstPoint[j].Y < lstEnd[i].Y) {
if (pLeft.X > lstPoint[j].X)
{
pLeft = lstPoint[j];//矩形最左边的点
}
if (pRight.X < lstPoint[j].X)
{
pRight = lstPoint[j];//矩形最右边的点
}
}
}
lstLeft.Add(pLeft);
lstRight.Add(pRight);
}
//确定两张图片的差异部分,画出红色矩形
Graphics g1 = Graphics.FromImage(bmOld);
Graphics g2 = Graphics.FromImage(bmNew);
for (int i = 0; i < lstStart.Count; i++)
{
int height = lstEnd[i].Y - lstStart[i].Y + 10;//矩形高度
int width = lstRight[i].X - lstLeft[i].X + 10;//矩形宽度
FontFamily fm = new FontFamily(GenericFontFamilies.Monospace);
Font f = new Font(fm, 16, FontStyle.Bold);
string number = Convert.ToString(i + 1);//矩形的序号
g1.DrawRectangle(Pens.Red, lstLeft[i].X - 5, lstStart[i].Y - 5, width, height);//在旧图片上画矩形
g1.DrawString(number, f, Brushes.Red, lstLeft[i].X, lstStart[i].Y - 7);//给旧图片上的每个矩形添加序号
g2.DrawRectangle(Pens.Red, lstLeft[i].X - 5, lstStart[i].Y - 5, width, height);//在新图片上画矩形
g2.DrawString(number, f, Brushes.Red, lstLeft[i].X, lstStart[i].Y - 7);//给新图片上的每个矩形添加序号
}
g1.Dispose();
g2.Dispose();
lstBitmap.Add(bmOld);
lstBitmap.Add(bmNew);
return lstBitmap;
}。