Mi pregunta es similar a Cómo conseguir la correcta posición de píxel de coordenadas del ratón?, con la salvedad de que la imagen es potencialmente un TransformedBitmap
, donde los giros y rotaciones podría ser aplicado, y todavía devolver las coordenadas de píxel de la imagen original.
Mi Window
's diseño se parece a esto:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
y el código subyacente se parece a esto:
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();
}
Cuando se pasa el mouse en la esquina inferior derecha (que yo de color azul para facilitar el seguimiento de las no transformadas de la imagen, puede ver correctamente las coordenadas de (~4, ~3), que son las dimensiones de la imagen.
Sin embargo, una vez que usted aplica una transformación, por ejemplo cambiar TheImage.Source = bs;
a TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
, se cierne sobre el azul en lugar de da (~4, ~0).
Creo que uno podía mirar a los reales valores de la matriz de la transformación, y determinar cómo ajustar el punto en todos los casos, pero parece que debe haber una solución más fácil el uso de la inversa de la transformación.
Image
en unGrid
que tiene un fondo y se mueve elMouseMove
evento para elGrid
el píxel de coordenadas no son más precisas cuando fuera de los límites de la imagen, ya que sólo da respuestas desde 0..de ancho y 0..de altura. ¿Alguna idea de cómo solucionar este problema?