文章目錄
- 能找出以片左右兩部分中的五處不同嗎?
- 找不到沒關係,用程式把圖片處理一下就清楚了。
- 結果如下:
能找出以片左右兩部分中的五處不同嗎? 找不到沒關係,用程式把圖片處理一下就清楚了。 using System;<br />using System.Collections.Generic;<br />using System.Drawing;<br />using System.Drawing.Imaging;<br />using System.Linq;<br />using System.Windows.Forms;<br />using System.Runtime.InteropServices;</p><p>namespace SpotDiff<br />{<br /> public partial class Form1 : Form<br /> {<br /> public Form1()<br /> {<br /> InitializeComponent();<br /> }</p><p> private void processButton_Click(object sender, EventArgs e)<br /> {<br /> var bmp = pictureBox1.Image as Bitmap;<br /> var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);<br /> var bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);<br /> var ptr = bmpData.Scan0;<br /> var bytes = bmpData.Stride * bmp.Height;<br /> var rgbValues = new byte[bytes];<br /> Marshal.Copy(ptr, rgbValues, 0, bytes);</p><p> var w = bmp.Width / 2;<br /> var h = bmp.Height;<br /> var dx = 0;<br /> List<Point> pts = null;<br /> var lastSim = 0.0;<br /> for(; dx < w; ++dx)<br /> {<br /> pts = GetSimilarPoints(bmpData, rgbValues, w, h, dx);<br /> var sim = pts.Count() / ((double)(w - dx) * h);<br /> System.Diagnostics.Debug.WriteLine(sim);<br /> if(sim < lastSim){<br /> pts = GetSimilarPoints(bmpData, rgbValues, w, h, --dx);<br /> break;<br /> }<br /> lastSim = sim;<br /> }</p><p> if(dx < w)<br /> foreach (var pt in pts)<br /> {<br /> var offset1 = pt.Y * bmpData.Stride + pt.X * 3;<br /> var offset2 = pt.Y * bmpData.Stride + (pt.X + w + dx) * 3;<br /> rgbValues[offset1] = 255; rgbValues[offset2] = 255;<br /> rgbValues[offset1 + 1] = 0; rgbValues[offset2 + 1] = 0;<br /> rgbValues[offset1 + 2] = 0; rgbValues[offset2 + 2] = 0;<br /> }</p><p> Marshal.Copy(rgbValues, 0, ptr, bytes);<br /> bmp.UnlockBits(bmpData);<br /> pictureBox1.Refresh();<br /> }</p><p> private static List<Point> GetSimilarPoints(BitmapData bmpData, byte[] rgbValues, int w, int h, int dx)<br /> {<br /> return (<br /> from x in Enumerable.Range(0, w - dx)<br /> from y in Enumerable.Range(0, h)<br /> let offset1 = y * bmpData.Stride + x * 3<br /> let offset2 = y * bmpData.Stride + (x + w + dx) * 3<br /> where rgbValues[offset1] == rgbValues[offset2] &&<br /> rgbValues[offset1 + 1] == rgbValues[offset2 + 1] &&<br /> rgbValues[offset1 + 2] == rgbValues[offset2 + 2]<br /> select new Point(x, y)).ToList();<br /> }<br /> }<br />}<br /> 結果如下: