趣味編程:用LINQ自動“找茬”

來源:互聯網
上載者:User
文章目錄
  • 能找出以片左右兩部分中的五處不同嗎?
  • 找不到沒關係,用程式把圖片處理一下就清楚了。
  • 結果如下:
 能找出以片左右兩部分中的五處不同嗎?  找不到沒關係,用程式把圖片處理一下就清楚了。 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 /> 結果如下: 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.