ยังไงฉันแปลงจากเมาส์พิกัดที่จะพิกเซลจุดพิกัดของ TransformedBitmap?

0

คำถาม

คำถามคือคล้ายกับ วิธีที่จะถูกตำแหน่งของพิกเซลจากเมาส์พิกัด, กับการเพิ่ม caveat นภาพอาจจะเป็น TransformedBitmapอยู่ที่ไหนเอื้อมถือและ rotations อาจจะสมัครและยังคงกลับไปที่พิกเซลจุดพิกัดของภาพต้นฉบับ

ของฉัน Window's ออกแบบดูเหมือนนี้:

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

และ codebehind ดูเหมือนนี้:

        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();
        }

ตอนป้วนเปี้ยนอยู่ทางด้านล่าง-ตรงหัวมุม(ซึ่งผมสีน้ำเงินสำหรับเรื่องง่ายตามรอย)ของที่ไม่เปลี่ยนภาพเธออย่างถูกต้องเห็นจุดพิกัดของ(~4,~3)ซึ่งคือมิติขนาดของภาพ.

enter image description here

อย่างไรก็ตามครั้งหนึ่งคุณต้องปรับใช้รูปร่างตัวอย่างเช่นการเปลี่ยน TheImage.Source = bs; ต้อง TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));,ดูเหมือนจนตรองสีน้ำเงินแทนที่จะทำให้(~4,~0).

enter image description here

ฉันคิดว่าหนึ่งอาจดูจริงเมตริกซ์ว่างค่าต่างๆของเปลี่ยนและพิจารณาว่าจะให้ปรับตัวประเด็นอยู่ตลอดหลากหลายคดี,แต่มันดูเหมือนว่าน่าจะมีทางออกง่ายขึ้นโดยใช้ข้อมูลรายละเอีเปลี่ยนไป

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

คำตอบที่ดีที่สุด

1

เมื่อภาพธาตุ renders เป็น TransformedBitmap ที่จุดศูนย์กลางของกลายร่างเป็นรถเพิกเฉยและภาพบิตแมพเป็นยแปลงร่างไปเป็นเหมาะสมประสานงานระยะ

ตั้งแต่นี้เลื่อนมันไม่สมัครไปที่ transfomation ของจุดคุณต้องชดเชยมัน e.g. เหมือนนี้:

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).

เพื่อที่จะทำให้มันทำงานสำหรับ Transforms กับเผด็จการซะหน่อจุดศูนย์กลาคุณต้องการการพักผ่อนนิดที่ออฟเซ็ตค่าของในที่เปลี่ยนเมตริกซ์ว่าง:

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

ขอบคุณ! ถ้าใครคนใดคนหนึ่ง embeds ง Image ใน Grid ซึ่งเป็นพื้นหลังของและย้าย MouseMove เหตุการณ์ไป Gridคนพิกเซลจุดพิกัดคือไม่ถูกต้องตอนที่อยู่นอกขอบเขตของภาพตั้งแต่มันเดียวที่จะให้คำตอบจาก 0..ความกว้างและ 0..ความสูงของ. รู้ไหมว่าจะแก้ไขเรื่องนี้?
Craig W

มีหลายเหมือนกันกับที่ฉันทำน่ะล่ะ ส่วนใหญ่เรียบง่ายให้แนบเป็นสิ่งที่แนบมาด้วยเหตุการณ์เครื่องมือจัดการกันอีกรอบการพ่ออีลีเมนต์นั่นคนเดียวกับมิติขนาดภาพเป็นภาพได้ที่นี่ ไม่อย่างนั้นมันมีวิธีการเหมือน TransformToDescendant หรืออาการคล้ายๆแบบนี้
Clemens

ฉันตามไม่ทันแฮะ ฉันสามารถแปลความหมายที่ประเด็นจากพ่อแม่ตามไปที่รูปภาพไม่มีปัญหา แต่สำหรับตัวอย่างเช่นเมื่อผู้ใช้ hovers ที่อยู่ทางขวามือของหมุนภาพฉันก็เหมือน y-ประสานงานจะเป็นยังเพื่อจะได้ไตร่ตรองว่าพวกเขาเหนือขอบเขตของภาพในการจัดวางดั้งเดิม. ฉันควรจะแก้ไขคำถามของผมหรือเริ่มต้นใหม่หรอ?
Craig W

ดีกว่าเขียนใหม่
Clemens

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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