Ma question est similaire à la Façon dont pour obtenir la bonne position de pixel de coordonnées de la souris?, avec la mise en garde que l'image est potentiellement un TransformedBitmap
où sauts et rotations pourraient être appliquées, et toujours retourner les coordonnées des pixels de l'image originale.
Mon Window
's design ressemble à ceci:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
et le code ressemble à ceci:
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();
}
Lorsque vous placez le curseur dans le coin inférieur droit (que j'ai coloré en bleu pour faciliter le suivi) de la non-transformée de l'image, à vous de voir correctement les coordonnées de (~4, ~3), qui sont les dimensions de l'image.
Cependant, une fois que vous appliquer une transformation, pour exemple, l'évolution du TheImage.Source = bs;
pour TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
, planant au-dessus de la bleue à la place donne (~4, ~0).
Je pense que l'on peut voir les valeurs de matrice de la transformation, et de déterminer comment ajuster le point dans tous les cas, mais il semble qu'il devrait y avoir une solution plus facile à l'aide de la transformation inverse.
Image
dans unGrid
qui a un arrière-plan et déplace leMouseMove
de l'événement à l'Grid
le pixel de coordonnées ne sont plus précis quand à l'extérieur des limites de l'image, car elle ne donne de réponses à partir de 0..largeur et de 0..hauteur. Une idée de comment résoudre ce problème?