>백엔드 개발 >C++ >C# 변환을 사용하여 마우스 커서로 확대/축소할 때 이미지가 점프하는 이유는 무엇입니까?

C# 변환을 사용하여 마우스 커서로 확대/축소할 때 이미지가 점프하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-25 06:47:43331검색

Why Does My Image Jump When Zooming from the Mouse Cursor Using C# Transformations?

변환을 사용하여 마우스 커서에서 이미지 확대/축소

이 시나리오에서는 비트맵 원점을 마우스 위치로 변환한 다음 이미지 크기를 조정하고 원점을 변환하기 위해 Paint 이벤트의 변환을 사용하는 마우스 위치 뒤로.

문제:

  • 마우스 위치를 변환할 때 이미지가 이동하고 재배치된 원점에서 크기 조정에 실패합니다.
  • 회전, 마우스로 변환하지 않고도 크기 조정 및 팬 기능이 올바르게 작동합니다. 위치.

플랫폼:

  • .Net 4.7.2
  • Windows 10 1909의 Visual Studio (18363.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);
}

가능한 해결 방법:

이 문제를 해결하려면 마우스 위치에서 부드럽게 확대/축소하려면 다음 제안 사항을 고려하세요. 트릭:

1. 분할 및 정복: 다양한 그래픽 효과와 변형을 특정 작업을 수행하는 별도의 전문 방법으로 분류합니다. 그런 다음 필요할 때 원활하게 함께 작동할 수 있도록 이러한 방법을 설계하세요.

2. 단순하게 유지하세요: 여러 그래픽 변환을 적용할 때 행렬이 쌓이는 순서로 인해 혼란과 예상치 못한 결과가 발생할 수 있습니다. 특정 변환(주로 변환 및 크기 조정)을 미리 계산하고 GDI가 사전 처리된 개체 및 모양의 렌더링을 처리하도록 하는 것이 더 간단합니다.

3. 올바른 도구 사용: 이와 같은 시나리오에서는 패널을 "캔버스"로 사용하는 것이 권장되지 않습니다. 활성화할 수는 있지만 이중 버퍼링이 부족합니다. 그러나 PictureBox(또는 비시스템 플랫 라벨)는 기본적으로 이중 버퍼링을 제공하며 하위 컨트롤을 포함하기보다는 그리기용으로 설계되었습니다.

4. 확대/축소 모드 구현: 마우스 위치에서 맹목적으로 크기를 조정하는 대신 확대/축소 동작을 제어할 수 있는 다양한 방법을 제공합니다. ImageLocation, CenterCanvas, CenterMouse 및 MouseOffset과 같은 확대/축소 모드를 구현하여 유연성을 제공하고 다양한 사용 사례를 충족합니다.

이 지침을 따르고 맞춤형 확대/축소 모드를 구현하면 마우스 위치에서 부드럽고 효과적인 확대/축소를 달성할 수 있습니다. 원하는 이미지 위치와 배율을 유지합니다.

위 내용은 C# 변환을 사용하여 마우스 커서로 확대/축소할 때 이미지가 점프하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.