La mia domanda è simile a Come ottenere una corretta posizione dei pixel da coordinate del mouse?, con l'ulteriore avvertenza che l'immagine è potenzialmente un TransformedBitmap
dove salti mortali e rotazioni potrebbe essere applicato, e ancora restituire le coordinate in pixel dell'immagine originale.
Il mio Window
's design simile a questo:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
e il codebehind assomiglia a questo:
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();
}
Quando si passa il mouse nell'angolo in basso a destra (che ho colorato di blu per una facile rintracciabilità) di non trasformato immagine, vedere correttamente le coordinate di (~4, ~3), che sono le dimensioni dell'immagine.
Tuttavia, una volta che si applica una trasformazione, per esempio cambiando TheImage.Source = bs;
per TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
passando sopra il blu dà invece (~4, ~0).
Penso si possa guardare l'effettiva i valori della matrice di trasformazione, e di determinare le modalità per regolare il punto in tutti i vari casi, ma sembra che ci dovrebbe essere una soluzione più semplice utilizzando la trasformata inversa.
Image
in unGrid
che ha un background e sposta ilMouseMove
evento per ilGrid
il pixel di coordinate non sono più accurate se al di fuori dei limiti dell'immagine dal momento che si dà solo risposte da 0..larghezza e 0..altezza. Qualsiasi idea di come risolvere questo problema?