Я использую код, найденный здесь:
Как обрезать часть изображения в позиции курсора?
Исходный графический блок, большой графический блок справа имеет размер 600 400, а размер левого маленького обрезанного изображения – 243 256. Когда мышь находится внутри изображения в исходном графическом блоке, обрезанное изображение в обрезанном графическом блоке не является правой обрезанной областью.< /п> Я хочу, чтобы независимо от размера исходного и обрезанного PictureBox и размера изображения при перемещении мыши внутри исходного PictureBox в обрезанном PictureBox показывалась правая обрезанная область линзы.
еще проблемы:
При изменении ширины и высоты размера объектива во время выполнения он не меняется.
При изменении отмеченных переключателей форма линзы не меняется.
Кроме того, флажок относительного размера практически ничего не меняет, если он установлен/снят.
Снимок экрана формы при запуске, когда указатель мыши находится над исходным PictureBox, и то, что отображается в небольшом обрезанном PictureBox:

код формы1
с использованием системы; использование System.Collections.Generic; использование System.ComponentModel; использование System.Data; использование System.Drawing; используя System.Drawing.Drawing2D; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование System.Windows.Forms; пространство имен Cropping_Images { публичный частичный класс Form1: Форма { Растровое изображение sourceImage = null; RectangleF imageLens = RectangleF.Empty; Размер LensPixelSize = новый размер (100, 100); LensType LensType = LensType.Circular; bool LensUseRelativeSize = ложь; bool drawLens = ложь; частное перечисление LensType { Круглый, Прямоугольный } общедоступная форма1() { ИнициализироватьКомпонент(); PictureBoxOriginal.Image = Image.FromFile(@"d:\Screenshots\rec1.jpg"); sourceImage = new Bitmap(Image.FromFile(@"d:\Screenshots\rec1.jpg")); } частная пустота Form1_Load (отправитель объекта, EventArgs e) { } Private void PictureBoxOriginal_MouseMove (отправитель объекта, MouseEventArgs e) { imageLens.Location = GetLensPosition(e.Location, imageLens); imageLens.Size = LensUseRelativeSize ? GetScaledLensSize(pictureBoxOriginal.ClientRectangle, sourceImage.Size, LensPixelSize) : размер пикселя линзы; PictureBoxOriginal.Invalidate(); PictureBoxCropped.Invalidate(); } частный PointF GetLensPosition (PointF centerPosition, RectangleF rect) { вернуть новый PointF(centerPosition.X - (rect.Width/2), centerPosition.Y - (rect.Height/2)); } частный SizeF GetScaledLensSize (RectangleF холст, SizeF imageSize, SizeF LensSize) { float ScaleRatio = GetImageScaledRatio (холст, imageSize); вернуть новый SizeF(lensSize.Width * ScaleRatio, LensSize.Width * ScaleRatio); } частный float GetImageScaledRatio (RectangleF холст, SizeF imageSize) { return Math.Max(canvas.Width, Canvas.Height)/ Math.Max(imageSize.Width, imageSize.Height); } частный RectangleF CanvasToImageRect (RectangleF холст, SizeF imageSize, RectangleF прямоугольник) { float ScaleRatio = GetImageScaledRatio (холст, imageSize); вернуть новый RectangleF(новый PointF(rect.X/scaleRatio, rect.Y/scaleRatio), новый SizeF(rect.Width/scaleRatio, rect.Height/scaleRatio)); } Private void imageBoxOriginal_Paint (отправитель объекта, PaintEventArgs e) { используя (Pen pen = новое перо(Color.Red, 2.0f)) { pen.DashStyle = DashStyle.Dash; переключатель (тип линзы) { случай LensType.Circular: e.Graphics.DrawEllipse(pen, Rectangle.Round(imageLens)); перерыв; корпус LensType.Rectangular: e.Graphics.DrawRectangle(pen, Rectangle.Round(imageLens)); перерыв; } } } Private void imageBoxCropped_Paint (отправитель объекта, PaintEventArgs e) { if (!drawLens) return; Раздел RectangleF = CanvasToImageRect(pictureBoxOriginal.ClientRectangle, sourceImage.Size, imageLens); DrawImageSelection(e.Graphics, PictureBoxCropped.ClientRectangle, раздел, sourceImage); } Private void DrawImageSelection (Graphics g, холст RectangleF, изображение RectangleF imageSection, изображение изображения) { g.SmoothingMode = SmoothingMode.AntiAlias; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(изображение, холст, imageSection, GraphicsUnit.Pixel); переключатель (тип линзы) { случай LensType.Circular: используя (var path = новый GraphicsPath()) { путь.AddEllipse(холст); g.SetClip(путь, JointMode.Exclude); используя (var Brush = new SolidBrush(Color.FromArgb(160, Color.Black))) { g.FillRectangle(кисть, холст); г.ResetClip(); используя (var pen = новое перо(кисть, 1f)) g.DrawEllipse(перо, холст); } } перерыв; корпус LensType.Rectangular: // НЕТ перерыв; } } Private void checkBoxRelativeSize_CheckedChanged (отправитель объекта, EventArgs e) => LensUseRelativeSize = checkBoxRelativeSize.Checked; Private void radioButtonCircularLens_CheckedChanged (отправитель объекта, EventArgs e) => LensType = (LensType)(int.Parse((отправитель как Control).Tag.ToString())); Private void imageBoxOriginal_MouseEnter (отправитель объекта, EventArgs e) => drawLens = правда; Private void imageBoxOriginal_MouseLeave (отправитель объекта, EventArgs e) { drawLens = ложь; PictureBoxCropped.Invalidate(); } } }