ยังไงฉันแปลงจากเมาส์พิกัดที่จะพิกเซลจุดพิกัดของ TransformedBitmap ฝังอยู่ในที่ใหญ่กว่าพ่อแม่ตู้คอนเทนเนอร์?

0

คำถาม

คล้ายกับของคน ได้ยังไงฉันแปลงจากเมาส์พิกัดที่จะพิกเซลจุดพิกัดของ TransformedBitmap? แต่กับคนเพิ่ม wrinkle นั่นของฉัน Image ที่จริงแล้วฝังอยู่ในที่ใหญ่กว่าพ่อแม่ Gridซึ่งมีเบื้องหลังและฉันจะเหมือนพิกเซลจุดพิกัดไปยังเป็นตอนที่ถูกต้องป้วนเปี้ยนอยู่ในดินแดนอกเหนือขอบเขตของภาพได้ที่นี่

นี่คือของฉัน XAML:

    <DockPanel>
        <Label DockPanel.Dock="Bottom" Name="TheLabel" />
        <Grid DockPanel.Dock="Top" Name="TheGrid" Background="Gray" MouseMove="TheGrid_MouseMove">
            <Image Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" />
        </Grid>
    </DockPanel>

และนี่คือรหัส:

        public MainWindow()
        {
            InitializeComponent();

            const int WIDTH = 4;
            const int HEIGHT = 3;
            byte[] pixels = new byte[WIDTH * HEIGHT * 3];
            // top-left corner red, bottom-right corner blue for orientation
            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 = new TransformedBitmap(bs, new RotateTransform(90.0));
        }

        private void TheGrid_MouseMove(object sender, MouseEventArgs e)
        {
            Point p = TheGrid.TranslatePoint(e.GetPosition(TheGrid), 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)
                {
                    Matrix inverse = tb.Transform.Value;
                    inverse.Invert();
                    inverse.OffsetX = 0.0;
                    inverse.OffsetY = 0.0;
                    p = inverse.Transform(p);
                    int w = tb.Source.PixelWidth;
                    int h = tb.Source.PixelHeight;
                    p = new Point((p.X + w) % w, (p.Y + h) % h);
                }
                TheLabel.Content = p.ToString();
            }
        }

สำหรับคนส่วนใหญ่ส่วนหนึ่งมันทำงานงั้นนะแต่ถ้าเธอเมาส์อยู่เหนือในเกรย์ทางด้านซ้ายของหมุนรูปภาพ(ขนาดเวลาอย่างน้อยอยู่ที่ไหน X คือที่จับภาพด้านล่างนี้),คุณได้คุยประสานงาน(0.5)ที่ทำให้มันดูเหมือนคุณอยู่ในภาพตอนที่อยู่ในความเป็นจริงคุณออกไปข้างนอกและป y-ประสานงาควรจะสูงกว่าที่ความสูงของภาพเพื่อจะได้ไตร่ตรองเรื่องนี้

enter image description here

เรื่องนี้มันสำคัญเพราะว่าฉันพยายามจะอนุญาตให้ผู้ใช้ที่เลือกเป็น ROI และฉันต้องการรู้ว่าตอนที่การเลือกนอกเหนือภาพขอบเขตแม้ว่าฉันยังคงต้องการจะอนุญาต

.net bitmapsource c# image
2021-11-23 17:48:44
1

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

1

คุณอาจจะแสดงการเปลี่ยนแปรงบนเป็น"ทดสอบประเด็น"ในภาพขอบเขต(e.g. ศูนย์กลาง)และเศษการหารปฏิบัติการที่ลี่ยนไปทดสอบระเด็น งั้นใช้ช่วงเวลาระหว่างเปลี่ยนบททดสองจุดและปรับตัว(โดยเศษการหาร)อทดสอบจุดปรับตัวจริงๆแล้ว

var p = e.GetPosition(TheImage);

p = new Point(
    p.X * bs.PixelWidth / TheImage.ActualWidth,
    p.Y * bs.PixelHeight / TheImage.ActualHeight);

if (TheImage.Source is TransformedBitmap tb)
{
    var inverse = tb.Transform.Value;
    inverse.Invert();
    inverse.OffsetX = 0.0;
    inverse.OffsetY = 0.0;

    var w = tb.Source.PixelWidth;
    var h = tb.Source.PixelHeight;

    var v = new Vector(bs.PixelWidth / 2, bs.PixelHeight / 2); // test point
    var v1 = inverse.Transform(v); // transformed test point
    var v2 = new Vector((v1.X + w) % w, (v1.Y + h) % h); // adjusted

    p = inverse.Transform(p) - v1 + v2; // add adjusting offset
}

TheLabel.Content = $"x: {p.X:F2}, y: {p.Y:F2}";
2021-11-23 22:03:56

การทดสอบจากจุดศูนย์กลางของภาพ;หรือ..ยาแก้โรคหืด ขอบคุณ!
Craig W

ในภาษาอื่นๆ

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

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