Sorum, fare koordinatlarından pikselin doğru konumunu nasıl alacağına benzer mi?, görüntünün potansiyel olarak bir TransformedBitmap
çevirmelerin ve döndürmelerin uygulanabileceği ve yine de orijinal görüntünün piksel koordinatlarını döndürebileceği yerler.
Benim Window
'nin tasarımı şuna benziyor:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
ve kod arka tarafı şuna benziyor:
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();
}
Dönüştürülmemiş görüntünün sağ alt köşesinde (kolay izleme için mavi renklendirdim) gezinirken, görüntü boyutları olan (~4, ~3) koordinatlarını doğru görürsünüz.
Ancak, bir dönüşümü uyguladıktan sonra, örneğin değiştirme TheImage.Source = bs;
-e doğru TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
, mavinin üzerine gelmek yerine (~4, ~0) verir.
Dönüşümün gerçek matris değerlerine bakabileceğini ve tüm çeşitli durumlarda noktanın nasıl ayarlanacağını belirleyebileceğini düşünüyorum, ancak ters dönüşümü kullanarak daha kolay bir çözüm olması gerektiği anlaşılıyor.
Image
in aGrid
bir arka plana sahip olan ve hareket edenMouseMove
etkinliğeGrid
piksel koordinatları, yalnızca 0'dan yanıtlar verdiği için görüntünün sınırları dışındayken artık doğru değildir..genişlik ve 0..yükseklik. Bunu düzeltmek için nasıl bir fikriniz var mı?