C#圖像處理之截取panel

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System;

using System.Configuration;

using System.IO;

using System.Xml;

using System.Data.SqlClient;

using System.Data.OleDb;

using System.Net.NetworkInformation;

using System.Diagnostics;

using System.Reflection;

using Microsoft.Win32;

using System.Text.RegularExpressions;

using System.Threading;

using System.Net;

using System.Runtime.InteropServices;

namespace W

{

? ? public partial class Form1 : Form

? ? {



? ? ? ? #region 初始化

? ? ? ? public Form1()

? ? ? ? {

? ? ? ? ? ? InitializeComponent();

? ? ? ? }

? ? ? ? public static int cvt_int(object num)

? ? ? ? {

? ? ? ? ? ? try { return (int)Convert.ToDouble(num); }

? ? ? ? ? ? catch { return 0; }

? ? ? ? }

? ? ? ? #endregion

? ? ? ? #region 截圖

? ? ? ? private void button2_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? Camera.WVS_ForceSendLaneHv(1,0);

? ? ? ? }

? ? ? ? private void textBox3_TextChanged(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? try{

? ? ? ? ? ? ? ? Convert.ToInt32(textBox3.Text);

? ? ? ? ? ? }

? ? ? ? ? ? catch{

? ? ? ? ? ? textBox3.Text="0";

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? private void label10_Click(object sender, EventArgs e)

? ? ? ? {

? ? ? ? }

? ? ? ? bool enDraw = false;

? ? ? ? private void catchPicBTN_Click(object sender, EventArgs e)

? ? ? ? {//? Create? pen.?

? ? ? ? ? // takePicPlus(videoPanel);

? ? ? ? ////2、正方形

? ? ? ? //g.DrawRectangle(thepen, ps.X, ps.Y, 0.5F, 0.5F);

? ? ? ? ////3、指定的圖形

? ? ? ? //Bitmap? bm=new? Bitmap(2,2);? ? //這里調(diào)整點(diǎn)的大小?

? ? ? ? //bm.SetPixel(0,? 0,? color);? ? ? //設(shè)置點(diǎn)的顏色?

? ? ? ? //bm.SetPixel(0,? 1,? color);?

? ? ? ? //bm.SetPixel(1,? 0,? color);?

? ? ? ? //bm.SetPixel(1,? 1,? color);?

? ? ? ? //Graphics? g? =? Graphics.FromHwnd(this.panel1.Handle);? ? //畫(huà)在哪里? ?

? ? ? ? //g.DrawImageUnscaled(bm,? e.X,? e.Y);? ? ? //具體坐標(biāo)

? ? ? ? ? ? //Form1_Paint(this, new PaintEventArgs(CreateGraphics(), ClientRectangle));

? ? ? ? ? ? if(catchPicBTN.Text.Equals("繪制識(shí)別區(qū)域"))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? enDraw = true;

? ? ? ? ? ? ? ? catchPicBTN.Text="開(kāi)啟軟件抓拍";

? ? ? ? ? ? }

? ? ? ? ? ? else if(catchPicBTN.Text.Equals("開(kāi)啟軟件抓拍")&&pointYList.Count>=4)

? ? ? ? ? ? {



? ? ? ? ? ? ? ? enDraw =false;

? ? ? ? ? ? ? ? catchPicBTN.Text="關(guān)閉軟件抓拍";

? ? ? ? ? ? ? ? //獲取最大四邊形區(qū)域

? ? ? ? ? ? ? ? getMaxPlace();

? ? ? ? ? ? ? ? // takePic4Math(videoPanel).Save(picPath());

? ? ? ? ? ? ? ? //開(kāi)啟區(qū)域內(nèi)抓拍線程

? ? ? ? ? ? ? ? //takePicSharp();

? ? ? ? ? ? ? ? ImageHashHelper.getMathPoint(pointXList, pointYList);

? ? ? ? ? ? ? ? timer4catchPicTick = true;


? ? ? ? ? ? ? ? //catchPicThread = new Thread(catchPic);

? ? ? ? ? ? ? ? //catchPicThread.IsBackground = true;

? ? ? ? ? ? ? ? //catchPicThread.Start();

? ? ? ? ? ? }else if(catchPicBTN.Text.Equals("關(guān)閉軟件抓拍"))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //catchPicThread.Join();

? ? ? ? ? ? ? ? //關(guān)閉區(qū)域內(nèi)抓拍線程

? ? ? ? ? ? ? ? //清除最大四邊形區(qū)域

? ? ? ? ? ? ? ? ? catchPicBTN.Text="繪制識(shí)別區(qū)域";

? ? ? ? ? ? ? ? ? clearVideoPanelPaint(videoPanel.CreateGraphics());

? ? ? ? ? ? }

? ? ? ? ? ? //整個(gè)Panel上截圖

? ? ? ? ? ? //takePic(videoPanel).Save(picPath());

? ? ? ? }

? ? ? ? void takePicPlus(Panel panel) // Bitmap takePicPlus(Panel panel)

? ? ? ? {

? ? ? ? ? ? Bitmap bitmap = new Bitmap(128, 160);

? ? ? ? ? ? //創(chuàng)建作圖區(qū)域?

? ? ? ? ? ? Graphics graphic = Graphics.FromImage(bitmap);


? ? ? ? ? ? ? ? Point p = panel.PointToScreen(panel.Location);

? ? ? ? ? ? ? ? //截取原圖相應(yīng)區(qū)域?qū)懭胱鲌D區(qū)?

? ? ? ? ? ? ? ? //graphic.DrawImage(this.pb_photo_original.Image, new Rectangle(0, 0, 128, 160), oldCutRect, GraphicsUnit.Pixel);

? ? ? ? ? ? ? ? graphic.CopyFromScreen(p.X, p.Y, 0, 0, new Size(128, 160));

? ? ? ? ? ? ? ? Bitmap zoomBitmap = new Bitmap(bitmap, new Size(80, 100));

? ? ? ? ? ? ? ? //panel.Image = zoomBitmap;

? ? ? ? ? ? ? ? //保存圖象?

? ? ? ? ? ? ? ? zoomBitmap.Save(@"D:\test.jpg");

? ? ? ? ? ? ? ? //return bitmap;


? ? ? ? ? ? bitmap.Dispose();

? ? ? ? ? ? graphic.Dispose();?

? ? ? ? }

? ? ? ? void takePicPP(Panel panel) // Bitmap takePicPlus(Panel panel)

? ? ? ? {

? ? ? ? ? ? //Bitmap bitmap = new Bitmap(maxX - minX, maxY - minY);

? ? ? ? ? ? Bitmap bitmap = new Bitmap(maxX , maxY);

? ? ? ? ? ? //創(chuàng)建作圖區(qū)域?

? ? ? ? ? ? Graphics graphic = Graphics.FromImage(bitmap);

? ? ? ? ? ? Point p = panel.PointToScreen(panel.Location);

? ? ? ? ? ? //截取原圖相應(yīng)區(qū)域?qū)懭胱鲌D區(qū)?

? ? ? ? ? ? graphic.DrawImage(bitmap, new Rectangle(0, 0, maxX, maxY));

? ? ? ? ? ? //graphic.CopyFromScreen(0, 0, p.X - minX, p.Y - minY, new Size(maxX - minX, maxY - minY));

? ? ? ? ? ? int tx=maxX - minX;

? ? ? ? ? ? int ty = maxY - minY;

? ? ? ? ? ? //Bitmap zoomBitmap = new Bitmap(bitmap, new Size(maxX - minX, maxY - minY));

? ? ? ? ? ? //panel.Image = zoomBitmap;

? ? ? ? ? ? //保存圖象?

? ? ? ? ? ? //zoomBitmap.Save(@"D:\test.jpg");

? ? ? ? ? ? //return bitmap;

? ? ? ? ? ? bitmap.Save(@"D:\test1.jpg");

? ? ? ? ? ? bitmap.Dispose();

? ? ? ? ? ? graphic.Dispose();

? ? ? ? }

? ? ? ? Bitmap takePicSharp()

? ? ? ? {

? ? ? ? ? ? Bitmap bit = new Bitmap(maxX - minX, maxY - minY);

? ? ? ? ? ? //Bitmap bit = new Bitmap(videoPanel.Width, videoPanel.Height);

? ? ? ? ? ? Graphics g = Graphics.FromImage(bit);

? ? ? ? ? ? ///Point p = videoPanel.PointToScreen(videoPanel.Location);

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //stem.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);


? ? ? ? ? ? ? ? //g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bit.Size);

? ? ? ? ? ? ? ? //g.CopyFromScreen(new Point(videoPanel.Location.X, videoPanel.Location.Y), new Point(videoPanel.Location.X, videoPanel.Location.Y), bit.Size);

? ? ? ? ? ? ? // g.CopyFromScreen(this.Location, Point.Empty, bit.Size);

? ? ? ? ? ? ? ? //1,2參數(shù),截取的起始點(diǎn),3,4繪制的的起始點(diǎn),5圖片大小

? ? ? ? ? ? ? ? g.CopyFromScreen(this.Location.X + (videoPanel.Location.X) + minX, this.Location.Y + (videoPanel.Location.Y) + minY, 0, 0, bit.Size);//videoPanel.Location.X +

? ? ? ? ? ? ? ? //SaveFileDialog saveFileDialog = new SaveFileDialog();

? ? ? ? ? ? ? ? //saveFileDialog.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif";

? ? ? ? ? ? ? ? //if (saveFileDialog.ShowDialog() != DialogResult.Cancel)

? ? ? ? ? ? ? ? //{

? ? ? ? ? ? ? ? //bit.Save(saveFileDialog.FileName);

? ? ? ? ? ? ? ? //}

? ? ? ? ? ? ? ? return bit;

? ? ? ? ? ? }

? ? ? ? ? ? finally {

? ? ? ? ? ? ? ? g.Dispose();

? ? ? ? ? ? }


? ? ? ? }

? ? ? ? Bitmap takePicSharpAll()

? ? ? ? {

? ? ? ? ? ? Bitmap bit = new Bitmap(videoPanel.Width, videoPanel.Height);

? ? ? ? ? ? //Bitmap bit = new Bitmap(videoPanel.Width, videoPanel.Height);

? ? ? ? ? ? Graphics g = Graphics.FromImage(bit);

? ? ? ? ? ? ///Point p = videoPanel.PointToScreen(videoPanel.Location);

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //stem.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);

? ? ? ? ? ? ? ? g.CopyFromScreen(this.Location, Point.Empty, bit.Size);

? ? ? ? ? ? ? ? //g.CopyFromScreen(new Point(videoPanel.Location.X, videoPanel.Location.Y), new Point(videoPanel.Location.X, videoPanel.Location.Y), bit.Size);

? ? ? ? ? ? ? ? // g.CopyFromScreen(this.Location, Point.Empty, bit.Size);

? ? ? ? ? ? ? ? //1,2參數(shù),截取的起始點(diǎn),3,4繪制的的起始點(diǎn),5圖片大小

? ? ? ? ? ? ? ? //g.CopyFromScreen(this.Location.X + (videoPanel.Location.X) + minX, this.Location.Y + (videoPanel.Location.Y) + minY, 0, 0, bit.Size);//videoPanel.Location.X +

? ? ? ? ? ? ? ? //SaveFileDialog saveFileDialog = new SaveFileDialog();

? ? ? ? ? ? ? ? //saveFileDialog.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif";

? ? ? ? ? ? ? ? //if (saveFileDialog.ShowDialog() != DialogResult.Cancel)

? ? ? ? ? ? ? ? //{

? ? ? ? ? ? ? ? //bit.Save(saveFileDialog.FileName);

? ? ? ? ? ? ? ? //}

? ? ? ? ? ? ? ? return bit;

? ? ? ? ? ? }

? ? ? ? ? ? finally

? ? ? ? ? ? {

? ? ? ? ? ? ? ? g.Dispose();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? //截取指定panel的圖片

? ? ? ? Bitmap takePic(Panel panel)

? ? ? ? {

? ? ? ? ? ? Point ScrollMaxInfo = GetScrollPoint(panel);

? ? ? ? ? ? Size ControlMaxSize = GetControlSize(panel, ScrollMaxInfo);

? ? ? ? ? ? Bitmap TempImage = new Bitmap(panel.Width - 16, panel.Height - 16);

? ? ? ? ? ? Bitmap ControlImage = new Bitmap(ControlMaxSize.Width, ControlMaxSize.Height);

? ? ? ? ? ? Graphics MainGraphics = Graphics.FromImage(ControlImage);

? ? ? ? ? ? try

? ? ? ? ? ? {


? ? ? ? ? ? ? ? int StepWidth = GetScrollNumb(panel.Width - 16, ScrollMaxInfo.X);

? ? ? ? ? ? ? ? int StepHeight = GetScrollNumb(panel.Height - 16, ScrollMaxInfo.Y);

? ? ? ? ? ? ? ? int LogWidth = 0;

? ? ? ? ? ? ? ? int LogHeigh = 0;


? ? ? ? ? ? ? ? for (int i = 0; i != StepWidth; i++)

? ? ? ? ? ? ? ? {


? ? ? ? ? ? ? ? ? ? LogHeigh = 0;

? ? ? ? ? ? ? ? ? ? for (int z = 0; z != StepHeight; z++)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? panel.DrawToBitmap(TempImage, new Rectangle(0, 0, panel.Width - 16, panel.Height - 16));

? ? ? ? ? ? ? ? ? ? ? ? MainGraphics.DrawImage(TempImage, LogWidth, LogHeigh);


? ? ? ? ? ? ? ? ? ? ? ? LogHeigh = GetScrollPoint(1, panel);

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? LogWidth = GetScrollPoint(0, panel);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return ControlImage;

? ? ? ? ? ? }

? ? ? ? ? ? finally{

? ? ? ? ? ? ? ? MainGraphics.Dispose();

? ? ? ? ? ? ? ? TempImage.Dispose();

? ? ? ? ? ? }



? ? ? ? }

? ? ? ? //截取指定panel的圖片 4Math

? ? ? ? Bitmap takePic4Math(Panel panel)

? ? ? ? {

? ? ? ? ? ? Point ScrollMaxInfo = GetScrollPoint(panel);

? ? ? ? ? ? //Size ControlMaxSize = GetControlSize(panel, ScrollMaxInfo);

? ? ? ? ? ? Bitmap TempImage = new Bitmap(maxX - minX, maxY - minY);

? ? ? ? ? ? Bitmap ControlImage = new Bitmap(maxX - minX, maxY - minY);

? ? ? ? ? ? Graphics MainGraphics = Graphics.FromImage(ControlImage);

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? int m = maxX - minX;

? ? ? ? ? ? ? ? int k = maxY - minY;

? ? ? ? ? ? ? ? int StepWidth = GetScrollNumb(maxX - minX, ScrollMaxInfo.X);

? ? ? ? ? ? ? ? int StepHeight = GetScrollNumb(maxY - minY, ScrollMaxInfo.Y);

? ? ? ? ? ? ? ? int LogWidth = 0;

? ? ? ? ? ? ? ? int LogHeigh = 0;

? ? ? ? ? ? ? ? for (int i = 0; i != StepWidth; i++)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? LogHeigh = 0;

? ? ? ? ? ? ? ? ? ? for (int z = 0; z != StepHeight; z++)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? panel.DrawToBitmap(TempImage, new Rectangle(minX, minY, maxX, maxY));

? ? ? ? ? ? ? ? ? ? ? ? MainGraphics.DrawImage(TempImage, LogWidth, LogHeigh);

? ? ? ? ? ? ? ? ? ? ? ? LogHeigh = GetScrollPoint(1, panel);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? LogWidth = GetScrollPoint(0, panel);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return ControlImage;

? ? ? ? ? ? }

? ? ? ? ? ? finally

? ? ? ? ? ? {

? ? ? ? ? ? ? ? MainGraphics.Dispose();

? ? ? ? ? ? ? ? TempImage.Dispose();

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? private string areaPicPath()

? ? ? ? {

? ? ? ? ? ? string picDir = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "areaPic\\" + DateTime.Now.ToString("yyyy-MM-dd") + "\\";

? ? ? ? ? ? if (!Directory.Exists(picDir))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Directory.CreateDirectory(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "areaPic\\" + DateTime.Now.ToString("yyyy-MM-dd") + "\\");

? ? ? ? ? ? }

? ? ? ? ? ? string path = picDir + DateTime.Now.ToString("yyyyMMdd hhmmssfff") + ".png";

? ? ? ? ? ? return path;

? ? ? ? }

? ? ? ? private string picPath()

? ? ? ? {

? ? ? ? ? ? string picDir=System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase +"pic\\"+DateTime.Now.ToString( "yyyy-MM-dd")+"\\";

? ? ? ? ? ? if (!Directory.Exists(picDir))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Directory.CreateDirectory(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase +"pic\\"+DateTime.Now.ToString( "yyyy-MM-dd")+"\\");

? ? ? ? ? ? }

? ? ? ? ? ? string path = picDir + DateTime.Now.ToString("yyyyMMdd hhmmssfff") + ".png";

? ? ? ? ? ? return path;

? ? ? ? }

? ? ? ? #region API

? ? ? ? [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

? ? ? ? public struct SCROLLINFO

? ? ? ? {

? ? ? ? ? ? public uint cbSize;

? ? ? ? ? ? public uint fMask;

? ? ? ? ? ? public int nMin;

? ? ? ? ? ? public int nMax;

? ? ? ? ? ? public uint nPage;

? ? ? ? ? ? public int nPos;

? ? ? ? ? ? public int nTrackPos;

? ? ? ? }

? ? ? ? public enum ScrollBarInfoFlags

? ? ? ? {

? ? ? ? ? ? SIF_RANGE = 0x0001,

? ? ? ? ? ? SIF_PAGE = 0x0002,

? ? ? ? ? ? SIF_POS = 0x0004,

? ? ? ? ? ? SIF_DISABLENOSCROLL = 0x0008,

? ? ? ? ? ? SIF_TRACKPOS = 0x0010,

? ? ? ? ? ? SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)

? ? ? ? }

? ? ? ? public enum ScrollBarRequests

? ? ? ? {

? ? ? ? ? ? SB_LINEUP = 0,

? ? ? ? ? ? SB_LINELEFT = 0,

? ? ? ? ? ? SB_LINEDOWN = 1,

? ? ? ? ? ? SB_LINERIGHT = 1,

? ? ? ? ? ? SB_PAGEUP = 2,

? ? ? ? ? ? SB_PAGELEFT = 2,

? ? ? ? ? ? SB_PAGEDOWN = 3,

? ? ? ? ? ? SB_PAGERIGHT = 3,

? ? ? ? ? ? SB_THUMBPOSITION = 4,

? ? ? ? ? ? SB_THUMBTRACK = 5,

? ? ? ? ? ? SB_TOP = 6,

? ? ? ? ? ? SB_LEFT = 6,

? ? ? ? ? ? SB_BOTTOM = 7,

? ? ? ? ? ? SB_RIGHT = 7,

? ? ? ? ? ? SB_ENDSCROLL = 8

? ? ? ? }

? ? ? ? [DllImport("user32.dll", CharSet = CharSet.Auto)]

? ? ? ? public static extern int GetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si);

? ? ? ? [DllImport("user32")]

? ? ? ? public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool Rush);

? ? ? ? [DllImport("user32.dll", CharSet = CharSet.Auto)]

? ? ? ? public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

? ? ? ? #endregion

? ? ? ? /// <summary>

? ? ? ? /// 獲取目前滾動(dòng)條位置

? ? ? ? /// </summary>

? ? ? ? /// <param name="Bar"></param>

? ? ? ? /// <param name="MyControl"></param>

? ? ? ? /// <returns></returns>

? ? ? ? public static int GetScrollPoint(int Bar, Control MyControl)

? ? ? ? {

? ? ? ? ? ? SCROLLINFO ScrollInfo = new SCROLLINFO();

? ? ? ? ? ? ScrollInfo.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(ScrollInfo);

? ? ? ? ? ? ScrollInfo.fMask = (uint)ScrollBarInfoFlags.SIF_ALL;

? ? ? ? ? ? GetScrollInfo(MyControl.Handle, Bar, ref ScrollInfo);

? ? ? ? ? ? return ScrollInfo.nPos;

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// 獲取循環(huán)幾次獲得圖形

? ? ? ? /// </summary>

? ? ? ? /// <returns></returns>

? ? ? ? private static int GetScrollNumb(int MyControlNumb, int ScrollMaxInfoNumb)

? ? ? ? {

? ? ? ? ? ? double Step = (double)ScrollMaxInfoNumb / (double)MyControlNumb;

? ? ? ? ? ? Step++;

? ? ? ? ? ? if ((int)Step == Step)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return (int)Step;

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return (int)Step + 1;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// 獲得控件不需要滾動(dòng)條的寬和高(最終圖形大?。?/p>

? ? ? ? /// </summary>

? ? ? ? /// <param name="MyControl"></param>

? ? ? ? /// <param name="ScrollMaxInfo"></param>

? ? ? ? /// <returns></returns>

? ? ? ? private static Size GetControlSize(Control MyControl, Point ScrollMaxInfo)

? ? ? ? {

? ? ? ? ? ? return new Size(MyControl.Size.Width + ScrollMaxInfo.X - 16, MyControl.Size.Height + ScrollMaxInfo.Y - 16);

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// 獲取滾動(dòng)條數(shù)據(jù)

? ? ? ? /// </summary>

? ? ? ? /// <param name="MyControl"></param>

? ? ? ? /// <param name="ScrollSize"></param>

? ? ? ? /// <returns></returns>

? ? ? ? private static Point GetScrollPoint(Control MyControl)

? ? ? ? {

? ? ? ? ? ? Point MaxScroll = new Point();

? ? ? ? ? ? SCROLLINFO ScrollInfo = new SCROLLINFO();

? ? ? ? ? ? ScrollInfo.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(ScrollInfo);

? ? ? ? ? ? ScrollInfo.fMask = (uint)ScrollBarInfoFlags.SIF_ALL;

? ? ? ? ? ? GetScrollInfo(MyControl.Handle, 1, ref ScrollInfo);

? ? ? ? ? ? MaxScroll.Y = ScrollInfo.nMax - (int)ScrollInfo.nPage;

? ? ? ? ? ? if ((int)ScrollInfo.nPage == 0) MaxScroll.Y = 0;

? ? ? ? ? ? GetScrollInfo(MyControl.Handle, 0, ref ScrollInfo);

? ? ? ? ? ? MaxScroll.X = ScrollInfo.nMax - (int)ScrollInfo.nPage;

? ? ? ? ? ? if ((int)ScrollInfo.nPage == 0) MaxScroll.X = 0;

? ? ? ? ? ? return MaxScroll;

? ? ? ? }

? ? ? ? #endregion 截圖

? ? ? ? #region 繪圖

? ? ? ? private void Form1_Paint(object sender, PaintEventArgs e)

? ? ? ? {

? ? ? ? }

? ? ? ? List<int> pointXList = new List<int>();

? ? ? ? List<int> pointYList = new List<int>();

? ? ? ? //private void videoPanel_Paint(object sender, PaintEventArgs e)

? ? ? ? //{

? ? ? ? //? ? Pen blackPen = new Pen(Color.Blue, 3);

? ? ? ? //? ? //? Create? coordinates? of? points? that? define? line.?

? ? ? ? //? ? int x1 = backx;

? ? ? ? //? ? int y1 = backy;

? ? ? ? //? ? int x2 = e.ClipRectangle.X;

? ? ? ? //? ? int y2 = e.ClipRectangle.Y;

? ? ? ? //? ? //? Draw? line? to? screen.?

? ? ? ? //? ? e.Graphics.DrawLine(blackPen, x1, y1, x2, y2);

? ? ? ? //? ? backx = x2;

? ? ? ? //? ? backy = y2;

? ? ? ? //}

? ? ? ? private void clearVideoPanelPaint(Graphics r)

? ? ? ? {

? ? ? ? ? ? if (!enDraw)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? r.Clear(Color.Black);

? ? ? ? ? ? ? ? pointXList.Clear();

? ? ? ? ? ? ? ? pointYList.Clear();

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? private void videoPanelPaint(object sender, MouseEventArgs e, Graphics r)

? ? ? ? {

? ? ? ? ? ? if (!enDraw)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? r.Clear(Color.Black);

? ? ? ? ? ? ? ? pointXList.Clear();

? ? ? ? ? ? ? ? pointYList.Clear();

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? if (pointXList.Count >= 4)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pointXList.Add(pointXList[0]);

? ? ? ? ? ? ? ? pointYList.Add(pointYList[0]);

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? pointXList.Add(e.X);

? ? ? ? ? ? ? ? pointYList.Add(e.Y);

? ? ? ? ? ? }

? ? ? ? ? ? //if (e.Y == backy && backx == x1) return;

? ? ? ? ? ? //if (pointXList.Count >= 4) {

? ? ? ? ? ? //? ? x2 = pointXList[pointXList.Count - 1];

? ? ? ? ? ? //? ? y2 = pointYList[pointYList.Count - 1];

? ? ? ? ? ? //}

? ? ? ? ? ? try

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Pen bluePen = new Pen(Color.Blue, 2);

? ? ? ? ? ? ? ? if (pointYList.Count == 1)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? r.DrawEllipse(bluePen, pointXList[0]-1, pointYList[0]-1,3,3);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //if (backy == 0 && backx == 0) return;

? ? ? ? ? ? ? ? else if(pointYList.Count>=2)

? ? ? ? ? ? ? ? {


? ? ? ? ? ? ? ? ? ? //? Create? coordinates? of? points? that? define? line.?


? ? ? ? ? ? ? ? ? ? //? Draw? line? to? screen.?

? ? ? ? ? ? ? ? ? ? r.DrawLine(bluePen, pointXList[pointYList.Count - 1], pointYList[pointYList.Count - 1], pointXList[pointYList.Count - 2], pointYList[pointYList.Count - 2]);

? ? ? ? ? ? ? ? }


? ? ? ? ? ? }

? ? ? ? ? ? finally {


? ? ? ? ? ? ? ? if (pointXList.Count >= 5)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if (ImageHashHelper.isInTriangle2(pointXList[0], pointYList[0], pointXList[1], pointYList[1], pointXList[2], pointYList[2], pointXList[3], pointYList[3]))

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? pointXList.Clear();

? ? ? ? ? ? ? ? ? ? ? ? pointYList.Clear();

? ? ? ? ? ? ? ? ? ? ? ? r.Clear(Color.Black);

? ? ? ? ? ? ? ? ? ? ? ? textBox1.Text = "不要繪制凹四邊形";

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? pointXList.RemoveAt(0);

? ? ? ? ? ? ? ? ? ? ? ? pointYList.RemoveAt(0);

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? }

? ? ? ? ? ? }


? ? ? ? }


? ? ? ? private void videoPanel_MouseDoubleClick(object sender, MouseEventArgs e)

? ? ? ? {

? ? ? ? ? ? videoPanelPaint(sender, e, videoPanel.CreateGraphics());


? ? ? ? }

? ? ? ? ////假設(shè)panel1是將直線蓋住的控件

? ? ? ? //private void Form1_Paint(object sender, PaintEventArgs e)

? ? ? ? //{

? ? ? ? //e.Graphics.Clear(BackColor);

? ? ? ? //videoPanel.CreateGraphics().Clear(videoPanel.BackColor);

? ? ? ? //e.Graphics.DrawLine(Pens.Blue, new Point(0, 0), new Point(ClientRectangle.Width, ClientRectangle.Height));

? ? ? ? ////注意坐標(biāo)系變換。

? ? ? ? //videoPanel.CreateGraphics().DrawLine(Pens.Black, new Point(-videoPanel.Left, -videoPanel.Top), new Point(ClientRectangle.Width - videoPanel.Left, ClientRectangle.Height - videoPanel.Top));

? ? ? ? //}

? ? ? ? //private void Form1_SizeChanged(object sender, EventArgs e)

? ? ? ? //{

? ? ? ? //Form1_Paint(this, new PaintEventArgs(CreateGraphics(), ClientRectangle));

? ? ? ? //}

? ? ? ? #endregion 繪圖

? ? ? ? #region 識(shí)別區(qū)域


? ? ? ? int maxY;

? ? ? ? int maxX;

? ? ? ? int minX;

? ? ? ? int minY;

? ? ? ? void getMaxPlace()

? ? ? ? {

? ? ? ? ? ? if(pointYList.Count>=4&&pointXList.Count>=4)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? maxY=pointYList[0];

? ? ? ? ? ? ? ? maxX=pointXList[0];

? ? ? ? ? ? ? ? minX=pointXList[0];

? ? ? ? ? ? ? ? minY=pointYList[0];

? ? ? ? ? ? ? ? foreach (int i in pointXList)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if(i>maxX)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? maxX=i;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if(i<minX)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? minX=i;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? foreach (int j in pointYList)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if (j > maxY)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? maxY = j;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if (j < minY)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? minY = j;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? Graphics r = videoPanel.CreateGraphics();

? ? ? ? ? ? Pen redPen = new Pen(Color.Red, 2);

? ? ? ? ? ? r.DrawLine(redPen, minX, minY, maxX, minY);

? ? ? ? ? ? r.DrawLine(redPen, maxX, maxY, maxX, minY);

? ? ? ? ? ? r.DrawLine(redPen, maxX, maxY, minX, maxY);

? ? ? ? ? ? r.DrawLine(redPen, minX, minY, minX, maxY);

? ? ? ? }


? ? ? ? #endregion 識(shí)別區(qū)域

? ? ? ? #region 抓拍線程

? ? ? ? //Thread catchPicThread = null;

? ? ? ? void catchPic()

? ? ? ? {

? ? ? ? ? ? while (true) {


? ? ? ? ? ? }

? ? ? ? }

? ? ? ? #endregion 抓拍線程

? ? ? ? Bitmap pic4math = null;

? ? ? ? int loopSum = 0;

? ? ? ? double currentScore = 0;

? ? ? ? double scoreAvg = 0;

? ? ? ? bool initFlag = false;

? ? ? ? bool timer4catchPicTick = false;

? ? ? ? private void timer4catchPic_Tick(object sender, EventArgs e)

? ? ? ? {

? ? ? ? ? ? if (!timer4catchPicTick)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? loopSum = 0;

? ? ? ? ? ? ? ? currentScore = 0;

? ? ? ? ? ? ? ? scoreAvg = 0;

? ? ? ? ? ? ? ? initFlag = false;

? ? ? ? ? ? ? ? timer4catchPicTick = false;

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? if (loopSum > 32)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? initFlag = true;

? ? ? ? ? ? }

? ? ? ? ? ? if (loopSum > 1024)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? loopSum = 0;

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? loopSum++;

? ? ? ? ? ? }


? ? ? ? ? ? pic4math = takePicSharp();

? ? ? ? ? ? //保存計(jì)算圖片,到指定目錄

? ? ? ? ? // pic4math.Save(areaPicPath());


? ? ? ? ? ? currentScore = (double)ImageHashHelper.getAvg4UserInArea(pic4math);

? ? ? ? ? ? if (initFlag)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? if (currentScore > scoreAvg * 1.5 || currentScore * 1.66 < scoreAvg)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? takePicSharpAll().Save(picPath());

? ? ? ? ? ? ? ? ? ? pic4math.Save(areaPicPath());

? ? ? ? ? ? ? ? ? ? scoreAvg = scoreAvg + (currentScore - scoreAvg) / 32;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? scoreAvg = scoreAvg + (currentScore - scoreAvg) / 32;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? scoreAvg += currentScore / 32;

? ? ? ? ? ? }

? ? ? ? ? ? Thread.Sleep(64);

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容