Как сделать исходный PictureBox и обрезанный PictureBox относительными?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Как сделать исходный PictureBox и обрезанный PictureBox относительными?

Сообщение Гость »


Я использую код, найденный здесь:
Как обрезать часть изображения в позиции курсора?

Исходный графический блок, большой графический блок справа имеет размер 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(); } } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Отображение увеличенной части PictureBox в другом PictureBox при наведении курсора С#
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Найдите оптимальный обрезанный круг
    Гость » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Python — обрезанный блок с результирующей моделью yolov8
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • JavaScript обрезанный и изменение размера изображения в поле ввода
    Anonymous » » в форуме Jquery
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • JavaScript обрезанный и изменение размера изображения в поле ввода
    Anonymous » » в форуме Javascript
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»