Масштабирование и перевод изображения из положения мышиC#

Место общения программистов C#
Ответить
Anonymous
 Масштабирование и перевод изображения из положения мыши

Сообщение Anonymous »

Проблема: попытка масштабировать изображение из (или в) местоположении мыши с помощью преобразований в событии Paint для перевода начала растрового изображения в положение мыши, затем масштабировать изображение и перевести его начало обратно.
  • Изображение перескакивает и не может масштабироваться от перемещенного источника при перемещении положения мыши.
  • Поворот, масштабирование и панорамирование работают правильно без перевода в положение мыши.

Работа на .Net 4.7.2 с использованием Visual Studio в Windows 10 1909
v18363 .778


Соответствующие блоки кода:

private void trackBar1_Scroll(object sender, EventArgs e)
{
// Get rotation angle
ang = trackBar1.Value;
pnl1.Invalidate();
}

private void pnl1_MouseWheel(object sender, MouseEventArgs e)
{
// Get mouse location
mouse = e.location;

// Get new scale (zoom) factor
zoom = (float)(e.Delta > 0 ? zoom * 1.05 : zoom / 1.05);
pnl1.Invalidate();
}

private void pnl1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
pan = true;
mouX = e.X;
mouY = e.Y;
oldX = imgX;
oldY = imgY;
}

private void pnl1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left || !pan) return;

// Coordinates of panned image
imgX = oldX + e.X - mouX;
imgY = oldY + e.Y - mouY;
pnl1.Invalidate();
}

private void pnl1_MouseUp(object sender, MouseEventArgs e)
{
pan = false;
}

private void pnl1_Paint(object sender, PaintEventArgs e)
{
// Apply rotation angle @ center of bitmap
e.Graphics.TranslateTransform(img.Width / 2, img.Height / 2);
e.Graphics.RotateTransform(ang);
e.Graphics.TranslateTransform(-img.Width / 2, -img.Height / 2);

// Apply scaling factor - focused @ mouse location
e.Graphics.TranslateTransform(mouse.X, mouse.Y, MatrixOrder.Append);
e.Graphics.ScaleTransform(zoom, zoom, MatrixOrder.Append);
e.Graphics.TranslateTransform(-mouse.X, -mouse.Y, MatrixOrder.Append);

// Apply drag (pan) location
e.Graphics.TranslateTransform(imgX, imgY, MatrixOrder.Append);

// Draw "bmp" @ location
e.Graphics.DrawImage(img, 0, 0);
}


Подробнее здесь: https://stackoverflow.com/questions/619 ... e-location
Ответить

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

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

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

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

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