趣味编程:用LINQ自动“找茬”

 

能找出以下图片左右两部分中的五处不同吗?

 
趣味编程:用LINQ自动“找茬”_第1张图片
 

找不到没关系,用程序把图片处理一下就清楚了。

 
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; using System.Runtime.InteropServices; namespace SpotDiff { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void processButton_Click(object sender, EventArgs e) { var bmp = pictureBox1.Image as Bitmap; var rect = new Rectangle(0, 0, bmp.Width, bmp.Height); var bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); var ptr = bmpData.Scan0; var bytes = bmpData.Stride * bmp.Height; var rgbValues = new byte[bytes]; Marshal.Copy(ptr, rgbValues, 0, bytes); var w = bmp.Width / 2; var h = bmp.Height; var dx = 0; List<Point> pts = null; var lastSim = 0.0; for(; dx < w; ++dx) { pts = GetSimilarPoints(bmpData, rgbValues, w, h, dx); var sim = pts.Count() / ((double)(w - dx) * h); System.Diagnostics.Debug.WriteLine(sim); if(sim < lastSim){ pts = GetSimilarPoints(bmpData, rgbValues, w, h, --dx); break; } lastSim = sim; } if(dx < w) foreach (var pt in pts) { var offset1 = pt.Y * bmpData.Stride + pt.X * 3; var offset2 = pt.Y * bmpData.Stride + (pt.X + w + dx) * 3; rgbValues[offset1] = 255; rgbValues[offset2] = 255; rgbValues[offset1 + 1] = 0; rgbValues[offset2 + 1] = 0; rgbValues[offset1 + 2] = 0; rgbValues[offset2 + 2] = 0; } Marshal.Copy(rgbValues, 0, ptr, bytes); bmp.UnlockBits(bmpData); pictureBox1.Refresh(); } private static List<Point> GetSimilarPoints(BitmapData bmpData, byte[] rgbValues, int w, int h, int dx) { return ( from x in Enumerable.Range(0, w - dx) from y in Enumerable.Range(0, h) let offset1 = y * bmpData.Stride + x * 3 let offset2 = y * bmpData.Stride + (x + w + dx) * 3 where rgbValues[offset1] == rgbValues[offset2] && rgbValues[offset1 + 1] == rgbValues[offset2 + 1] && rgbValues[offset1 + 2] == rgbValues[offset2 + 2] select new Point(x, y)).ToList(); } } }
 

结果如下:

 
趣味编程:用LINQ自动“找茬”_第2张图片

你可能感兴趣的:(编程,object,null,Class,byte,LINQ)