कैसे मैं से परिवर्तित माउस के लिए निर्देशांक पिक्सेल निर्देशांक की एक TransformedBitmap में एम्बेडेड एक बड़ी माता पिता के कंटेनर?

0

सवाल

इसी तरह करने के लिए कैसे करते हैं मैं से परिवर्तित माउस के लिए निर्देशांक पिक्सेल निर्देशांक की एक TransformedBitmap? लेकिन साथ जोड़ा गया शिकन है कि मेरे 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();
            }
        }

अधिकांश भाग के लिए यह अच्छी तरह से काम करता है, लेकिन अगर आप मंडराना में ग्रे की बाईं करने के लिए घुमाया छवि (मोटे तौर पर जहां एक्स नीचे स्क्रीनशॉट में), आप एक y-निर्देशांक (0.5) है कि बनाता है यह देखो की तरह आप कर रहे हैं छवि में, जब वास्तविकता में आप कर रहे हैं बाहर है, और y-समन्वय होना चाहिए की तुलना में उच्च छवि ऊंचाई को प्रतिबिंबित करने के लिए ।

enter image description here

यह महत्वपूर्ण है क्योंकि मैं कोशिश कर रहा हूँ करने के लिए उपयोगकर्ता की अनुमति दें करने के लिए एक रॉय का चयन करें, और मैं पता करने की जरूरत है जब चयन से परे है छवि सीमा है, हालांकि मैं अभी भी चाहते हैं के लिए यह अनुमति देते हैं.

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

सबसे अच्छा जवाब

1

आप प्रदर्शन कर सकते हैं परिवर्तन पर एक "परीक्षण बिंदु" छवि के अंदर सीमा (उदाहरण के लिए केंद्र) और सापेक्ष आपरेशन पर तब्दील परीक्षण बिंदु. तो उपयोग के बीच ऑफसेट तब्दील परीक्षण बिंदु और समायोजित (modulo द्वारा) परीक्षण बिंदु को समायोजित करने के लिए वास्तविक बात है.

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