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

0

सवाल

मेरा सवाल है इसी तरह करने के लिए प्राप्त करने के लिए कैसे की सही स्थिति पिक्सेल माउस से निर्देशांक?, के साथ जोड़ा चेतावनी है कि छवि है एक संभावित TransformedBitmapहै , जहां के flips और घुमाव लागू किया जा सकता है, और अभी भी वापस पिक्सेल निर्देशांक के मूल छवि.

मेरे Window'एस डिजाइन इस तरह दिखता है:

    <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 के एक बिंदु, आप क्षतिपूर्ति करने के लिए यह, उदाहरण के लिए, इस तरह:

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

धन्यवाद! यदि एक 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ý
..................................................................................................................