나는 어떻게 변환하에서 마우스 좌표하는 픽셀의 좌표를 TransformedBitmap?

0

질문

나의 질문과 유사 하는 방법이 올바른 위치의 픽셀에서 마우스 좌표?, 추가 주의 이미지가 잠재적으로 TransformedBitmap는 곳,대칭과 회전이 적용될 수있다,과 픽셀의 좌표를 선명한 이미지를 제공합니다.

Window의인은 다음과 같다:

    <DockPanel>
        <Label DockPanel.Dock="Bottom" Name="TheLabel" />
        <Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
    </DockPanel>

고 코드 숨김 다음과 같습니다:

        public MainWindow()
        {
            InitializeComponent();

            const int WIDTH = 4;
            const int HEIGHT = 3;
            byte[] pixels = new byte[WIDTH * HEIGHT * 3];
            pixels[0] = Colors.Red.B;
            pixels[1] = Colors.Red.G;
            pixels[2] = Colors.Red.R;
            pixels[(WIDTH * (HEIGHT - 1) + (WIDTH - 1)) * 3 + 0] = Colors.Blue.B;
            pixels[(WIDTH * (HEIGHT - 1) + (WIDTH - 1)) * 3 + 1] = Colors.Blue.G;
            pixels[(WIDTH * (HEIGHT - 1) + (WIDTH - 1)) * 3 + 2] = Colors.Blue.R;
            BitmapSource bs = BitmapSource.Create(WIDTH, HEIGHT, 96.0, 96.0, PixelFormats.Bgr24, null, pixels, WIDTH * 3);
            TheImage.Source = bs;
        }

        private void TheImage_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = e.GetPosition(TheImage);
            if (TheImage.Source is TransformedBitmap tb)
                TheLabel.Content = tb.Transform.Inverse.Transform(new Point(p.X * tb.PixelWidth / TheImage.ActualWidth, p.Y * tb.PixelHeight / TheImage.ActualHeight)).ToString();
            else if (TheImage.Source is BitmapSource bs)
                TheLabel.Content = new Point(p.X * bs.PixelWidth / TheImage.ActualWidth, p.Y * bs.PixelHeight / TheImage.ActualHeight).ToString();
        }

면에서 오른쪽 하단(는 파란색으로 쉽게 추적하는)의 non-변환,이미지를 올바르게 참조 좌표가(~4,~3)는 이미지 크기입니다.

enter image description here

그러나,당신을 적용하면 변형,예를 들어 변경 TheImage.Source = bs; 하기 TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));유혹,블루 대신에게(~4,~0)입니다.

enter image description here

나는 생각 중 하나 볼 수있는 실제 매트릭스 값의 변형,그리고 결정하는 방법을 조정하는 지점에는 모든 다양한 경우에,그러나 그것은 수하는 간편한 솔루션을 사용하여 inverse transform.

.net bitmapsource c# image
2021-11-23 06:19:28
1

최고의 응답

1

이미지 요소를 렌더링하 TransformedBitmap,중심점의 변환 효과적으로 무시되고 비트맵으로 바뀌었는 적절한 조정 범위에 있습니다.

이후 이러한 변화에 적용되지 않습 transfomation 의점,당신은 당신을 보상하기 위해,예를 들어,다음과 같다:

var p = e.GetPosition(TheImage);

if (TheImage.Source is BitmapSource bs)
{
    p = new Point(
        p.X * bs.PixelWidth / TheImage.ActualWidth,
        p.Y * bs.PixelHeight / TheImage.ActualHeight);

    if (TheImage.Source is TransformedBitmap tb)
    {
        var w = tb.Source.PixelWidth;
        var h = tb.Source.PixelHeight;

        p = tb.Transform.Inverse.Transform(p);

        p = new Point((p.X + w) % w, (p.Y + h) % h);
    }

    TheLabel.Content = $"x: {(int)p.X}, y: {(int)p.Y}";
}

위의 코드는 것입니다 그러나 제대로 작동하지 않을 경우 변환 센터로 설정 값 이외의 다른 (0,0).

하기 위해 작품에 대한 변신으로 임의의 중심점을 분석 오프셋 값 변환 모체:

var p = e.GetPosition(TheImage);

if (TheImage.Source is BitmapSource bs)
{
    p = new Point(
        p.X * bs.PixelWidth / TheImage.ActualWidth,
        p.Y * bs.PixelHeight / TheImage.ActualHeight);

    if (TheImage.Source is TransformedBitmap tb)
    {
        var w = tb.Source.PixelWidth;
        var h = tb.Source.PixelHeight;
        var t = tb.Transform.Value;
        t.Invert();
        t.OffsetX = 0d;
        t.OffsetY = 0d;

        p = t.Transform(p);

        p = new Point((p.X + w) % w, (p.Y + h) % h);
    }

    TheLabel.Content = $"x: {(int)p.X}, y: {(int)p.Y}";
}
2021-11-23 10:54:45

감사합니다! 는 경우를 포함합 ImageGrid 는 배경과 이동 MouseMove 이벤트 Grid픽셀 좌표가 더 이상 정확하지 않을 때의 범위 밖에 있는 이미지 때문에 그것은 단지 대한 답변을 제공하 0..폭 0..높이입니다. 어떤 아이디어를 수정하는 방법 이?
Craig W

거기에 여러 가지 방법. 가장 간단한 연결 이벤트 처리기는 또 다른 중첩된 부모는 요소는 같은 차원으로 이미지입니다. 그렇지 않으면 거기는 방법은 다음과 같 TransformToDescendant 또는 이와 유사한.
Clemens

아 따릅니다. 내가 번역할 수 있는 시점에서 상위 그리드 이미지에 문제가 없습니다. 하지만 예를 들어 위에 마우스 포인터를 놓으면의 오른쪽으로 회전,이미지 내의 y 좌표은 부정적인 것을 반영하는 위의 경계에 있는 이미지 원래의 방향입니다. 해야정 나의 질문 또는 새로 시작하나요?
Craig W

더 나은 새로운 하나입니다.
Clemens

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................