using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ProductionControl { public partial class FrmPhoto : Form { private Control.ControlCollection picBoxList; private int picIndex; private int tagIndex; private double Xmm,Ymm; private Bitmap currBmp; // private double ratio = 1; // 图片的起始显示比例 private double ratioStep = 0.1; private Size pic_size; private int xPos; private int yPos; public FrmPhoto(Control.ControlCollection picBoxColl,int index) { InitializeComponent(); this.picBoxList = picBoxColl; this.picIndex = index; // this.Width = Screen.PrimaryScreen.WorkingArea.Width / 2; this.Location = new Point(0, 0); //size = _size; //this.ClientSize = new Size(this.ClientSize.Width, // (int)(this.ClientSize.Width * (size.Height * 1.0f / size.Width))); //this.pictureBox1.Size = this.ClientSize; //this.pictureBox1.Location = new Point(0, 0); } protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Up || keyData == Keys.Down || keyData == Keys.Left || keyData == Keys.Right) return false; else return base.ProcessDialogKey(keyData); } private void FrmPhoto_Load(object sender, EventArgs e) { PictureBox picBox = picBoxList[this.picIndex * 2] as PictureBox; Size size = picBox.Image.Size; this.panel1.ClientSize = new Size(this.panel1.ClientSize.Width, (int)(this.panel1.ClientSize.Width * (size.Height * 1.0f / size.Width))); this.pictureBox1.Size = this.panel1.ClientSize; this.pictureBox1.Location = new Point(0, 0); //this.pictureBox1.Image = bmp; pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; pictureBox1.MouseWheel += new MouseEventHandler(pictureBox1_MouseWheel); pictureBox1.MouseMove += pictureBox1_MouseMove; pictureBox1.MouseDown += pictureBox1_MouseDown; this.ActiveControl = this.pictureBox1; // 设置焦点 pic_size = this.panel1.ClientSize; // //MessageBox.Show("菜单栏厚度" + SystemInformation.MenuHeight.ToString()); //获取标准菜单栏的厚度 //MessageBox.Show("标题栏厚度" + SystemInformation.CaptionHeight.ToString()); //获取标准标题栏的厚度 this.Height = panel1.Bottom + SystemInformation.CaptionHeight + SystemInformation.MenuHeight + statusStrip1.Height; this.Left = (Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2; this.Top = (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2; } private void FrmPhoto_Shown(object sender, EventArgs e) { showPic(this.picIndex); } private void tsbtnPre_Click(object sender, EventArgs e) { showPic(--this.picIndex); } private void tsbtnNext_Click(object sender, EventArgs e) { showPic(++this.picIndex); } private void FrmPhoto_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Up: case Keys.Left: if (!this.tsbtnPre.Enabled) return; tsbtnPre_Click(null, null); break; case Keys.Down: case Keys.Right: if (!this.tsbtnNext.Enabled) return; tsbtnNext_Click(null, null); break; } } private void showPic(int index) { try { PictureBox picBox = picBoxList[index*2] as PictureBox; string[] tags = picBox.Tag.ToString().Split(','); this.tagIndex=Convert.ToInt32(tags[0]); this.Xmm = Convert.ToDouble(tags[1]); this.Ymm = Convert.ToDouble(tags[2]); //tsStateMsg.Text = $"索引:{tagIndex}, X:{Xmm}mm, Y:{Ymm}mm"; tsStateStep.Text = $"第{index+1}/{picBoxList.Count/2}张"; currBmp = (Bitmap)picBox.Image; this.pictureBox1.Image = (Bitmap)currBmp.Clone() ; // CheckBox cb = picBoxList[index * 2 + 1] as CheckBox; this.chkAdd.Checked = cb.Checked; // this.tsbtnPre.Enabled = (index > 0); this.tsbtnNext.Enabled = (index < picBoxList.Count / 2 - 1); } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void tsbtnSave_Click(object sender, EventArgs e) { try { if (Config.Defect_Small_SavePath.Trim() == "") throw new Exception("请先到系统设置中设置缺陷小图保存路径!"); // string savePath = ""; if (Config.Defect_Small_SavePath != "") { savePath = Config.Defect_Small_SavePath + "\\" + DateTime.Now.ToString("yyyyMMdd"); if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath); } //save PictureBox picBox = picBoxList[this.picIndex * 2] as PictureBox; string[] tags = picBox.Tag.ToString().Split(','); int tagIndex = Convert.ToInt32(tags[0]); //Xmm = Convert.ToDouble(tags[1]); //Ymm = Convert.ToDouble(tags[2]); CheckBox cb = picBoxList[this.picIndex * 2 + 1] as CheckBox; ((Bitmap)cb.Tag).Save($"{savePath}\\X{Xmm}_Y{Ymm}_K{tagIndex}_{DateTime.Now.Ticks}.bmp", ImageFormat.Bmp); //OpenCvSharp.Cv2.ImWrite($"{savePath}\\X{Xmm}_Y{Ymm}_K{tagIndex}_{DateTime.Now.Ticks}.bmp", ((OpenCvSharp.Mat)cb.Tag));//保存图片 MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void tsbtnClose_Click(object sender, EventArgs e) { this.Close(); } private void chkAdd_CheckedChanged(object sender, EventArgs e) { CheckBox cb = picBoxList[picIndex * 2 + 1] as CheckBox; cb.Checked = this.chkAdd.Checked; } //---------- private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) { Point pictureBoxPoint = this.PointToClient(Cursor.Position); //this.Text = $"{e.X}:{e.Y}; {pictureBoxPoint.X}:{pictureBoxPoint.Y}; {pictureBox1.Left}:{pictureBox1.Top}; " + // $"{this.pictureBox1.Width}:{this.pictureBox1.Height}; {this.Width}:{this.Height}; " + // $"Cursor:{Cursor.Position.X}:{Cursor.Position.Y}"; if (e.Delta > 0) { ratio += ratioStep; if (ratio > 100) // 放大上限 ratio = 100; else { int x = (int)(pictureBox1.Left - e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5); int y = (int)(pictureBox1.Top - e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5); //this.Text = $"{pictureBox1.Width}-{pic_size.Width};{ratio},{pictureBox1.Left}-{e.X}* 比例:{e.X*1.0d/pictureBox1.Width}={e.X}/{pictureBox1.Width} * {(ratioStep)}={x} | " + // $"{pictureBox1.Top}-{e.Y}* {e.Y * 1.0f / pictureBox1.Height * (ratio - 1.0d)}={y}"; this.changePictureBoxSize(new Point(x, y), ratio); } } else if (ratio - ratioStep >= 1) { ratio -= ratioStep; //if (ratio < 0.1) // 放大下限 // ratio = 0.1; //else int x = (int)(pictureBox1.Left + e.X * (e.X * 1.0d / pictureBox1.Width * ratioStep) + 0.5); int y = (int)(pictureBox1.Top + e.Y * (e.Y * 1.0d / pictureBox1.Height * ratioStep) + 0.5); this.changePictureBoxSize(new Point(x, y), ratio); } } private void changePictureBoxSize(Point location, double ratio) { var picSize = pictureBox1.Size; picSize.Width = Convert.ToInt32(pic_size.Width * ratio); picSize.Height = Convert.ToInt32(pic_size.Height * ratio); pictureBox1.Size = picSize; if (location.X > 0) location.X = 0; if (location.Y > 0) location.Y = 0; if (picSize.Width + location.X < this.panel1.ClientSize.Width) location.X = -(picSize.Width - this.panel1.ClientSize.Width); if (picSize.Height + location.Y < this.panel1.ClientSize.Height) location.Y = -(picSize.Height - this.panel1.ClientSize.Height); //Point location = new Point(); //location.X = (this.ClientSize.Width - this.pictureBox1.Width) / 2; //location.Y = (this.ClientSize.Height - this.pictureBox1.Height) / 2; this.pictureBox1.Location = location; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { try { // 鼠标按下拖拽图片 if (e.Button == MouseButtons.Left) { //this.Text = $"{e.X}:{e.Y};{xPos}:{yPos}"; // 限制拖拽出框 if (pictureBox1.Width > this.panel1.ClientSize.Width || pictureBox1.Height > this.panel1.ClientSize.Height) { int moveX = e.X - xPos; int moveY = e.Y - yPos; if ((pictureBox1.Left + moveX) <= 0 && (pictureBox1.Top + moveY) <= 0 && (pictureBox1.Right + moveX) >= this.panel1.ClientSize.Width && (pictureBox1.Bottom + moveY) >= this.panel1.ClientSize.Height) { pictureBox1.Left += moveX;//设置x坐标. pictureBox1.Top += moveY;//设置y坐标. } } } } catch (Exception dd) { MessageBox.Show(dd.Message); } } private void toolStripSeparator2_Click(object sender, EventArgs e) { } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { xPos = e.X;//当前x坐标. yPos = e.Y;//当前y坐标. } } }