using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Customize.Controls; namespace ShenTun.ImageCollection.Common { public partial class ImageView : UserControl { private static int rotaNum = 0; // 旋转角度 private static int pointRadis = 12; // 裁切点大小 private static Boolean clipMode = false; // 是否开启裁切 private static Boolean textMode = false; // 是否开启标注 private static Pen clipPen = new Pen(Color.Red, 10); // 裁切颜色 private static string imagePath = null; // 图像路径 private static Image sourceImage = null; // 初始输入图像源 private static Image outputImage = null; // 初始输出图像源 未使用 private static PictureBox currentPictureBox = null; // 当前图像容器 private static Panel currentImageBox = null; // 当前图像panel private static Panel currentClipPanel = null; // 裁切平面 private static ExtendedTextPanel currentInputPanel = null; // 文字输入框 private static Point one = new Point(0, 0); // 裁切调整坐标1 private static Point two = new Point(0, 0); // 裁切调整坐标2 private static Point three = new Point(0, 0); // 裁切调整坐标3 private static Point four = new Point(0, 0); // 裁切调整坐标4 private static PictureBox OneButton = new PictureBox(); // 裁切调整点1 private static PictureBox TwoButton = new PictureBox(); // 裁切调整点2 private static PictureBox ThreeButton = new PictureBox(); // 裁切调整点3 private static PictureBox FourButton = new PictureBox(); // 裁切调整点4 private static System.Drawing.Rectangle clipRect = new System.Drawing.Rectangle(0, 0, 0, 0); // 裁切矩形信息 private bool hasInit=false; private SelectImageInfo selectImage=null; private ApiService apiService = new ApiService(); private bool isShowList = false; public Point mouseDownPoint; // 记录鼠标点击坐标 public Point textPoint; public bool isSelected = false; // 是否点击图像 public bool isDrawing = false; // 是否点击图像 public bool isClicked = false; // 是否点击裁切矩形 public bool isClickedOne = false; // 是否点解裁切矩形调整点1 public bool isClickedTwo = false; // 是否点解裁切矩形调整点2 public bool isClickedThree = false; // 是否点解裁切矩形调整点3 public bool isClickedFour = false; // 是否点解裁切矩形调整点4 public ImageView() { InitializeComponent(); } public void LoadImageAndInit(MemoryStream mstr) { init(mstr, this.ImageBox, this.pictureBox); } public void LoadImageAndInit(MemoryStream mstr, SelectImageInfo imageInfo) { isShowList = true; init(mstr, this.ImageBox, this.pictureBox); selectImage = imageInfo; } /** * 初始化组件及事件 */ public void init(MemoryStream mstr,Panel currentImage, PictureBox pictureBox) { //imagePath = path.Trim(); sourceImage = ImageHelper.GetImage(mstr); currentImageBox = currentImage; if (!hasInit) { /************************按钮事件**************************/ this.reset.Click += new System.EventHandler(this.reset_Click); this.rotaLeft.Click += new System.EventHandler(this.rotaLeft_Click); this.roatRight.Click += new System.EventHandler(this.roatRight_Click); this.rota90.Click += new System.EventHandler(this.rota90_Click); this.rota180.Click += new System.EventHandler(this.rota180_Click); this.mirror.Click += new System.EventHandler(this.mirror_Click); this.vertical.Click += new System.EventHandler(this.vertical_Click); this.clip.Click += new System.EventHandler(this.clip_Click); this.textImport.Click += new System.EventHandler(this.textImport_Click); this.btnSave.Click += new System.EventHandler(this.btnSave_Click); this.btnClose.Click += new System.EventHandler(this.btnCancel_Click); this.btnList.Click += new System.EventHandler(this.btnList_Click); } currentPictureBox = pictureBox; currentPictureBox.Location = new Point(0, 0); currentPictureBox.Width = 0; currentPictureBox.Height = 0; currentPictureBox.Image = sourceImage; currentPictureBox.Width = sourceImage.Width; currentPictureBox.Height = sourceImage.Height; currentPictureBox.SizeMode = PictureBoxSizeMode.Zoom; //imagePath = path.Trim(); if (!hasInit) { this.SizeChanged += new EventHandler(this.ImageEdit_ResizeBegin); currentPictureBox.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseWheel); currentPictureBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown); currentPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove); currentPictureBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp); } /************************裁切框组件**************************/ OneButton.Size = new Size(pointRadis, pointRadis); TwoButton.Size = new Size(pointRadis, pointRadis); ThreeButton.Size = new Size(pointRadis, pointRadis); FourButton.Size = new Size(pointRadis, pointRadis); OneButton.BackColor = Color.Red; TwoButton.BackColor = Color.Red; ThreeButton.BackColor = Color.Red; FourButton.BackColor = Color.Red; OneButton.Visible = clipMode; TwoButton.Visible = clipMode; ThreeButton.Visible = clipMode; FourButton.Visible = clipMode; FourButton.TabIndex = 10000; if (!hasInit) { currentImageBox.Controls.Add(OneButton); currentImageBox.Controls.Add(TwoButton); currentImageBox.Controls.Add(ThreeButton); currentImageBox.Controls.Add(FourButton); currentImageBox.Controls.Add(pictureBox); } currentClipPanel = this.clipPanel; currentClipPanel.BackColor = Color.Transparent; currentClipPanel.Visible = false; currentClipPanel.Location = new Point(0, 0); currentClipPanel.Width = 0; currentClipPanel.Height = 0; if (!hasInit) { currentClipPanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.clip_MouseDown); currentClipPanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.clip_MouseMove); currentClipPanel.MouseUp += new System.Windows.Forms.MouseEventHandler(this.clip_MouseUp); OneButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.One_MouseDown); OneButton.MouseMove += new System.Windows.Forms.MouseEventHandler(this.One_MouseMove); OneButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.One_MouseUp); TwoButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Two_MouseDown); TwoButton.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Two_MouseMove); TwoButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Two_MouseUp); ThreeButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Three_MouseDown); ThreeButton.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Three_MouseMove); ThreeButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Three_MouseUp); FourButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Four_MouseDown); FourButton.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Four_MouseMove); FourButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Four_MouseUp); } clipRect.X = 0; clipRect.Y = 0; clipRect.Width = currentPictureBox.Image.Width; clipRect.Height = currentPictureBox.Image.Height; resetImageToPanel(); hasInit = true; this.btnList.Visible = isShowList; } public void ImageClear() { if (currentPictureBox.Image != null) { currentPictureBox.Image.Dispose(); } } private void ImageEdit_ResizeBegin(object sender, EventArgs e) { resetImageToPanel(); } private static void resetImageToPanel() { int windowWidth = currentImageBox.Width; int windowHeight = currentImageBox.Height; int imageWidth = clipRect.Width; int imageHeight = clipRect.Height; if (imageWidth >= imageHeight) { if (imageWidth > windowWidth) { double scaleHeight = (double)windowWidth / imageWidth * imageHeight; currentPictureBox.Width = windowWidth; currentPictureBox.Height = (int)scaleHeight; } else { currentPictureBox.Width = imageWidth; currentPictureBox.Height = imageHeight; } } else { if (imageHeight > windowHeight) { double scaleWidth = (double)windowHeight / imageHeight * imageWidth; currentPictureBox.Height = windowHeight; currentPictureBox.Width = (int)scaleWidth; } else { currentPictureBox.Width = imageWidth; currentPictureBox.Height = imageHeight; } } int X = (windowWidth - currentPictureBox.Width) / 2; int Y = (windowHeight - currentPictureBox.Height) / 2; currentPictureBox.Location = new Point(X, Y); } private void btnCancel_Click(object sender, EventArgs e) { if (currentPictureBox.Image != null) { currentPictureBox.Image.Dispose(); } if (this.Parent is Form) { if (((Form)this.Parent).Name.Equals("FrmImage")) { ((Form)this.Parent).DialogResult = DialogResult.Cancel; } } if (this.Parent is SplitterPanel) { if(this.Parent.Parent.Parent is Form) { if (((Form)this.Parent.Parent.Parent).Name.Equals("FrmImageList")) { ((Form)this.Parent.Parent.Parent).DialogResult = DialogResult.Cancel; } } } } private void btnList_Click(object sender, EventArgs e) { if (this.Parent is SplitterPanel) { if (this.Parent.Parent is SplitContainer) { ((SplitContainer)this.Parent.Parent).Panel1Collapsed = !((SplitContainer)this.Parent.Parent).Panel1Collapsed; } } } private async void btnSave_Click(object sender, EventArgs e) { if (clipMode) { this.clip.BackColor = Color.Transparent; this.clip.ForeColor = Color.Black; this.overPainting(); clipMode = false; } if (textMode) { writeToImage(); textMode = false; } if(this.Parent is Form) { ImageData.Image = (Bitmap)currentPictureBox.Image.Clone(); if (currentPictureBox.Image != null) { currentPictureBox.Image.Dispose(); } if (((Form)this.Parent).Name.Equals("FrmImage")) { ((Form)this.Parent).DialogResult = DialogResult.OK; } } if (this.Parent is SplitterPanel) { if (this.Parent.Parent.Parent is Form) { if (((Form)this.Parent.Parent.Parent).Name.Equals("FrmImageList")) { this.btnSave.Enabled = false; if (File.Exists(selectImage.Image.localPathName)) { File.Delete(selectImage.Image.localPathName); } var oldImg = (Bitmap)currentPictureBox.Image.Clone(); Bitmap img = new Bitmap(oldImg); Graphics draw = Graphics.FromImage(img); draw.DrawImage(oldImg, 0, 0, oldImg.Width, oldImg.Height); oldImg.Dispose(); int iPos = selectImage.Image.localPathName.LastIndexOf("\\"); string localFilename = selectImage.Image.localPathName.Substring(iPos + 1); using (MemoryStream stream = new MemoryStream()) { img.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); await apiService.UploadImage(stream, selectImage); } img.Save(selectImage.Image.localPathName, System.Drawing.Imaging.ImageFormat.Jpeg); img.Dispose(); this.btnSave.Enabled = true; } } } } private void reset_Click(object sender, EventArgs e) { if (!clipMode) { rotaNum = 0; currentPictureBox.Image = RotateImage(sourceImage, rotaNum); resetImageToPanel(); } } private void rotaLeft_Click(object sender, EventArgs e) { currentPictureBox.Image = RotateImage(sourceImage, rotaNum -= 5); } private void roatRight_Click(object sender, EventArgs e) { currentPictureBox.Image = RotateImage(sourceImage, rotaNum += 5); } private void mirror_Click(object sender, EventArgs e) { currentPictureBox.Image = turnOverImage(currentPictureBox.Image, "mirror"); } private void vertical_Click(object sender, EventArgs e) { currentPictureBox.Image = turnOverImage(currentPictureBox.Image, "vertical"); } private void rota90_Click(object sender, EventArgs e) { currentPictureBox.Image = RotateImage(sourceImage, rotaNum -= 90); } private void rota180_Click(object sender, EventArgs e) { currentPictureBox.Image = RotateImage(sourceImage, rotaNum -= 180); } private void writeToImage() { if (currentInputPanel == null) return; if (currentInputPanel.TransTextBox.Text.Length == 0) return; Graphics g = Graphics.FromImage(currentPictureBox.Image);//定义一个GDI+ SolidBrush drawBrush = new SolidBrush(currentInputPanel.TransTextBox.ForeColor);//定义一个画笔,在这里我读取了textBox1的字体颜色 Font drawFont = new Font(currentInputPanel.TransTextBox.Font.FontFamily, currentInputPanel.TransTextBox.Font.Size);//定义一个font,设置字的样式,大小,都是读取textBox1的值
         //往图片上写字。这里需要注意的是Point,因为在图片加载的时候你可能采取了一定的压缩或者放大,所以要乘以压缩比例scaling g.DrawString(currentInputPanel.TransTextBox.Text, drawFont, drawBrush, new Point(currentInputPanel.Location.X, currentInputPanel.Location.Y)); currentPictureBox.Controls.Remove(currentInputPanel);//然后移除添加的那个textBox1 } private void clip_Click(object sender, EventArgs e) { clipMode = !clipMode; if (textMode) { writeToImage(); textMode = false; this.textImport.BackColor = Color.Transparent; this.textImport.ForeColor = Color.Black; } if (clipMode) { this.clip.BackColor = Color.Blue; this.clip.ForeColor = Color.White; this.beginPainting(); } else { this.clip.BackColor = Color.Transparent; this.clip.ForeColor = Color.Black; this.overPainting(); } } private void textImport_Click(object sender, EventArgs e) { textMode = !textMode; if (clipMode) { this.clip.BackColor = Color.Transparent; this.clip.ForeColor = Color.Black; this.overPainting(); } if (textMode) { this.textImport.BackColor = Color.Blue; this.textImport.ForeColor = Color.White; } else { this.textImport.BackColor = Color.Transparent; this.textImport.ForeColor = Color.Black; writeToImage(); } } /************************图像鼠标事件**************************/ private void pictureBox_MouseWheel(object sender, MouseEventArgs e) { if (!clipMode && currentPictureBox.ClientRectangle.Contains(e.Location)) { ((HandledMouseEventArgs)e).Handled = true; currentPictureBox.Focus(); float zoomChange = e.Delta > 0 ? 2f : 0.5f; // 计算缩放后图片的大小 int newWidth = (int)(currentPictureBox.Width * zoomChange); int newHeight = (int)(currentPictureBox.Height * zoomChange); int newX = 0; int newY = 0; if (e.Delta > 0) { newX = (int)(currentPictureBox.Left - e.X); newY = (int)(currentPictureBox.Top - e.Y); } else { newX = (int)(currentPictureBox.Left + e.X / 2); newY = (int)(currentPictureBox.Top + e.Y / 2); } currentPictureBox.Size = new Size(newWidth, newHeight); currentPictureBox.Location = new Point(newX, newY); } } private void pictureBox_MouseDown(object sender, MouseEventArgs e) { if (!clipMode) { if (currentImageBox != null) { currentImageBox.Focus(); } if (e.Button == MouseButtons.Left) { if (textMode) { mouseDownPoint.X = e.Location.X; mouseDownPoint.Y = e.Location.Y; Cursor.Current = Cursors.Cross; isDrawing = true; this.addTextInput(e); } else { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; Cursor.Current = Cursors.SizeAll; isSelected = true; } } } } private void pictureBox_MouseMove(object sender, MouseEventArgs e) { if (!clipMode) { if (isDrawing) { this.resizeTextInput(e); mouseDownPoint.X = e.Location.X; mouseDownPoint.Y = e.Location.Y; } else if (isSelected) { currentPictureBox.Left = currentPictureBox.Left + (Cursor.Position.X - mouseDownPoint.X); currentPictureBox.Top = currentPictureBox.Top + (Cursor.Position.Y - mouseDownPoint.Y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } private void pictureBox_MouseUp(object sender, MouseEventArgs e) { if (textMode) { this.importTextInput(); } isSelected = false; isDrawing = false; } /*************************添加输入框*************************/ private void addTextInput(MouseEventArgs e) { Debug.WriteLine("addTextInput"); ExtendedTextPanel inputPanel = new ExtendedTextPanel(); currentInputPanel = inputPanel; currentInputPanel.Opacity = 0; currentInputPanel.Mode = "text"; currentPictureBox.Controls.Add(inputPanel); currentInputPanel.Size = new Size(0, 0); currentInputPanel.Location = new Point(e.Location.X, e.Location.Y); } private void resizeTextInput(MouseEventArgs e) { if (currentInputPanel != null) { int dtW = e.Location.X - mouseDownPoint.X; int dtH = e.Location.Y - mouseDownPoint.Y; currentInputPanel.Width += dtW; currentInputPanel.Height += dtH; } } private void importTextInput() { if (currentInputPanel == null) { return; } // 太小的不创建 if (currentInputPanel.Width < 10 || currentInputPanel.Height < 10) { currentPictureBox.Controls.Remove(currentInputPanel); currentInputPanel = null; return; } Debug.WriteLine("importTextInput"); currentInputPanel.showTransTextBox(); // currentInputPanel.LostFocus += new EventHandler(txt_LostFocus); //失去焦点后发生事件 // textBox.GotFocus += new EventHandler(txt_GotFocus); //获取焦点前发生事件 // textBox.MouseClick += new MouseEventHandler(txt_MouseClick); // 鼠标点击事件 } private void txt_LostFocus(object sender, EventArgs e) { Debug.WriteLine("txt_LostFocus"); TransTextBox textBox = (TransTextBox)sender; } private void txt_GotFocus(object sender, EventArgs e) { Debug.WriteLine("txt_GotFocus"); TransTextBox textBox = (TransTextBox)sender; ExtendedPanel inputPanel = (ExtendedPanel)textBox.Parent; } private void txt_MouseClick(object sender, EventArgs e) { Debug.WriteLine("txt_MouseClick"); TransTextBox textBox = (TransTextBox)sender; } /*************************裁切平面鼠标事件*************************/ private void clip_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isClicked = true; } } private void clip_MouseMove(object sender, MouseEventArgs e) { if (isClicked) { int dotaX = mouseDownPoint.X - Cursor.Position.X; int dotaY = mouseDownPoint.Y - Cursor.Position.Y; currentClipPanel.Left = currentClipPanel.Left - dotaX; currentClipPanel.Top = currentClipPanel.Top - dotaY; // 刷新第一、二、三、四个点位置 int newOneX = currentClipPanel.Location.X + currentClipPanel.Width / 2 - pointRadis / 2; int newTwoY = currentClipPanel.Location.Y + currentClipPanel.Height / 2 - pointRadis / 2; OneButton.Location = new Point(newOneX, currentClipPanel.Location.Y - pointRadis / 2); ThreeButton.Location = new Point(newOneX, currentClipPanel.Location.Y + currentClipPanel.Height - pointRadis / 2); TwoButton.Location = new Point(currentClipPanel.Location.X + currentClipPanel.Width - pointRadis / 2, newTwoY); FourButton.Location = new Point(currentClipPanel.Location.X - pointRadis / 2, newTwoY); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } private void clip_MouseUp(object sender, MouseEventArgs e) { isClicked = false; } /*************************第一个点鼠标事件*************************/ private void One_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; Cursor.Current = Cursors.SizeNS; isClickedOne = true; } } private void One_MouseMove(object sender, MouseEventArgs e) { if (isClickedOne) { int dotaY = mouseDownPoint.Y - Cursor.Position.Y; if (ThreeButton.Location.Y - OneButton.Location.Y > 50 || dotaY > 0) { // 计算高度和位置 currentClipPanel.Height = currentClipPanel.Height + dotaY; int newY = currentClipPanel.Location.Y - dotaY; currentClipPanel.Location = new Point(currentClipPanel.Location.X, newY); int newPointY = OneButton.Location.Y - dotaY; OneButton.Location = new Point(OneButton.Location.X, newPointY); // 刷新第二、四个点位置 int newTwoY = currentClipPanel.Location.Y + currentClipPanel.Height / 2 - pointRadis / 2; TwoButton.Location = new Point(TwoButton.Location.X, newTwoY); FourButton.Location = new Point(FourButton.Location.X, newTwoY); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } private void One_MouseUp(object sender, MouseEventArgs e) { isClickedOne = false; } /*************************第二个点鼠标事件*************************/ private void Two_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Cursor.Current = Cursors.SizeWE; mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isClickedTwo = true; } } private void Two_MouseMove(object sender, MouseEventArgs e) { if (isClickedTwo) { int dotaX = mouseDownPoint.X - Cursor.Position.X; if (TwoButton.Location.X - FourButton.Location.X > 50 || dotaX < 0) { // 计算宽度和位置 currentClipPanel.Width -= dotaX; int newPointX = TwoButton.Location.X - dotaX; TwoButton.Location = new Point(newPointX, TwoButton.Location.Y); // 刷新第一、三个点位置 int newOneX = currentClipPanel.Location.X + currentClipPanel.Width / 2 - pointRadis / 2; OneButton.Location = new Point(newOneX, OneButton.Location.Y); ThreeButton.Location = new Point(newOneX, ThreeButton.Location.Y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } private void Two_MouseUp(object sender, MouseEventArgs e) { isClickedTwo = false; } /*************************第三个点鼠标事件*************************/ private void Three_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Cursor.Current = Cursors.SizeNS; mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isClickedThree = true; } } private void Three_MouseMove(object sender, MouseEventArgs e) { if (isClickedThree) { int dotaY = mouseDownPoint.Y - Cursor.Position.Y; if (ThreeButton.Location.Y - OneButton.Location.Y > 50 || dotaY < 0) { // 计算高度和位置 currentClipPanel.Height = currentClipPanel.Height - dotaY; int newPointY = ThreeButton.Location.Y - dotaY; ThreeButton.Location = new Point(ThreeButton.Location.X, newPointY); // 刷新第二、四个点位置 int newTwoY = currentClipPanel.Location.Y + currentClipPanel.Height / 2 - pointRadis / 2; TwoButton.Location = new Point(TwoButton.Location.X, newTwoY); FourButton.Location = new Point(FourButton.Location.X, newTwoY); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } private void Three_MouseUp(object sender, MouseEventArgs e) { isClickedThree = false; } /*************************第四个点鼠标事件*************************/ private void Four_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Cursor.Current = Cursors.SizeWE; mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isClickedFour = true; } } private void Four_MouseMove(object sender, MouseEventArgs e) { if (isClickedFour) { // 计算宽度和位置 int dotaX = mouseDownPoint.X - Cursor.Position.X; if (TwoButton.Location.X - FourButton.Location.X > 50 || dotaX > 0) { currentClipPanel.Width += dotaX; int newX = currentClipPanel.Location.X - dotaX; currentClipPanel.Location = new Point(newX, currentClipPanel.Location.Y); int newPointX = FourButton.Location.X - dotaX; FourButton.Location = new Point(newPointX, FourButton.Location.Y); // 刷新第一、三个点位置 int newOneX = currentClipPanel.Location.X + currentClipPanel.Width / 2 - pointRadis / 2; OneButton.Location = new Point(newOneX, OneButton.Location.Y); ThreeButton.Location = new Point(newOneX, ThreeButton.Location.Y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } private void Four_MouseUp(object sender, MouseEventArgs e) { isClickedFour = false; } /***************************功能方法***********************/ /** * 绘制裁切框 */ private void beginPainting() { Debug.WriteLine("====beginPainting===="); OneButton.Visible = clipMode; TwoButton.Visible = clipMode; ThreeButton.Visible = clipMode; FourButton.Visible = clipMode; currentPictureBox.Image = RotateImage(sourceImage, rotaNum); currentPictureBox.Refresh(); // 初始化位置 setDefaultClipButtonPosition(); currentClipPanel.Visible = clipMode; } /** * 结束绘制 */ private void overPainting() { Debug.WriteLine("====overPainting===="); OneButton.Visible = clipMode; TwoButton.Visible = clipMode; ThreeButton.Visible = clipMode; FourButton.Visible = clipMode; currentPictureBox.Image = RotateImage(sourceImage, rotaNum); currentImageBox.Refresh(); // 裁切 clipBitmap(); currentClipPanel.Visible = clipMode; } /** * 初始化裁切框调整按钮到图像尺寸 */ private static void setDefaultClipButtonPosition() { int halfButton = pointRadis / 2; // 设置拖拉按钮 one.X = currentPictureBox.Location.X + currentPictureBox.Width / 2 - halfButton; one.Y = currentPictureBox.Location.Y - halfButton; OneButton.Location = one; two.X = currentPictureBox.Location.X + currentPictureBox.Width - halfButton; two.Y = currentPictureBox.Location.Y + currentPictureBox.Height / 2 - halfButton; TwoButton.Location = two; three.X = one.X; three.Y = currentPictureBox.Location.Y + currentPictureBox.Height - halfButton; ThreeButton.Location = three; four.X = currentPictureBox.Location.X - halfButton; four.Y = two.Y; FourButton.Location = four; currentClipPanel.Location = currentPictureBox.Location; currentClipPanel.Width = currentPictureBox.Width; currentClipPanel.Height = currentPictureBox.Height; Graphics graphicsClip = OneButton.CreateGraphics(); graphicsClip.DrawRectangle(clipPen, clipRect); graphicsClip.Dispose(); } /** * 裁切图片 */ private static void clipBitmap() { Image srcImage = currentPictureBox.Image; int X = currentClipPanel.Location.X - currentPictureBox.Location.X; int Y = currentClipPanel.Location.Y - currentPictureBox.Location.Y; int crossWidth = X < 0 ? currentClipPanel.Width + X : currentClipPanel.Width; int crossHeight = Y < 0 ? currentClipPanel.Height + Y : currentClipPanel.Height; int Width = crossWidth * srcImage.Width / currentPictureBox.Width; int Height = crossHeight * srcImage.Height / currentPictureBox.Height; X = X < 0 ? 0 : X * srcImage.Width / currentPictureBox.Width; Y = Y < 0 ? 0 : Y * srcImage.Height / currentPictureBox.Height; // 创建新图位图 Bitmap bitmap = new Bitmap(Width, Height); bitmap.SetResolution(srcImage.HorizontalResolution, srcImage.VerticalResolution); // 创建作图区域 Graphics graphic = Graphics.FromImage(bitmap); graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; // 截取原图相应区域写入作图区 Rectangle cRect = new Rectangle(X, Y, Width, Height); graphic.DrawImage(srcImage, 0, 0, cRect, GraphicsUnit.Pixel); graphic.Dispose(); /*Debug.WriteLine("SourceWidth===========>" + sourceImage.Width); Debug.WriteLine("SourceHeight===========>" + sourceImage.Height); Debug.WriteLine("Width===========>" + bitmap.Width); Debug.WriteLine("Height===========>" + bitmap.Height);*/ //从作图区生成新图 // currentPictureBox.Image = Image.FromHbitmap( bitmap.GetHbitmap() ); /********刷新图像*********/ currentPictureBox.Image = bitmap; sourceImage = bitmap; rotaNum = 0; currentImageBox.Refresh(); clipRect.X = 0; clipRect.Y = 0; clipRect.Width = Width; clipRect.Height = Height; /********刷新图像*********/ resetImageToPanel(); } /** * 旋转图像 */ private static Bitmap RotateImage(Image image, float angle) { if (image == null) { throw new ArgumentNullException("image"); } // 获取中心点 float halfWidth = image.Width / 2.0f; float halfHeight = image.Height / 2.0f; // 弧度转换 angle = angle % 360; double radian = angle * Math.PI / 180.0; double cos = Math.Cos(radian); double sin = Math.Sin(radian); int width = image.Width; int height = image.Height; // 计算旋转后的图像容器长宽 int resultWidth = (int)(Math.Max(Math.Abs(width * cos - height * sin), Math.Abs(width * cos + height * sin))); int resultHeight = (int)(Math.Max(Math.Abs(width * sin - height * cos), Math.Abs(width * sin + height * cos))); float centerX = resultWidth / 2; float centerY = resultHeight / 2; // 设置新的图像容器 Bitmap newImage = new Bitmap(resultWidth, resultHeight); newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); Graphics graphics = Graphics.FromImage(newImage); // 平移图像到中心点 graphics.TranslateTransform(centerX, centerY); // 旋转 graphics.RotateTransform(angle); // 再次平移回来 graphics.TranslateTransform(-centerX, -centerY); // 将图片绘制到中心点上 float resultX = centerX - halfWidth; float resultY = centerY - halfHeight; graphics.DrawImage(image, new PointF(resultX, resultY)); graphics.Dispose(); clipRect.X = 0; clipRect.Y = 0; clipRect.Width = resultWidth; clipRect.Height = resultHeight; resetImageToPanel(); // 如果是裁切将显示裁切框 /*if (clipMode) { Graphics graphicsClip = Graphics.FromImage(newImage); graphicsClip.DrawRectangle(rotaPen, clipRect); graphicsClip.Dispose(); }*/ /*Graphics graphicsClip = Graphics.FromImage(newImage); graphicsClip.DrawRectangle(rotaPen, clipRect); graphicsClip.Dispose();*/ return newImage; } /** * 水平镜像 */ private static Image turnOverImage(Image image, string mode) { Graphics g = Graphics.FromImage(image); Rectangle rect = new Rectangle(0, 0, currentPictureBox.Image.Width, currentPictureBox.Image.Height); switch (mode) { case "mirror": image.RotateFlip(RotateFlipType.RotateNoneFlipX); break; case "vertical": image.RotateFlip(RotateFlipType.RotateNoneFlipY); break; } g.DrawImage(image, rect); g.Dispose(); return image; } } }