Intrebarea mea este similar cu Modul de a obține poziția corectă a pixelilor de la mouse-ul coordonatele?, cu un plus de precizare că imaginea este un potențial TransformedBitmap
, în cazul în care răstoarnă și rotații ar putea fi aplicate, și încă a reveni la coordonatele pixel din imaginea originală.
Mea Window
modelului de proiectare se pare ca acest lucru:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
și codebehind pare ca acest lucru:
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();
}
Atunci când situându-se în partea de jos-dreapta sus (pe care am colorat-albastru pentru urmărirea ușoară) de non-transformat imagine, veți vedea corect coordonatele (~4, ~3), care sunt dimensiunile imaginii.
Cu toate acestea, odată ce ați aplica o transforma, de exemplu schimbarea TheImage.Source = bs;
pentru a TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
, situându-se peste albastru în loc dă (~4, ~0).
Cred că unul ar putea uita-te la real matrice de valori a transforma, și de a determina cum să se adapteze la punct în toate diferite cazuri, dar se pare ca acolo ar trebui să fie o soluție mai ușoară, folosind inversul transforma.
Image
într-unGrid
care are un fundal și mutăMouseMove
la evenimentGrid
, pixel de coordonate nu mai sunt corecte, atunci când sunt în afara limitelor de imagine, deoarece oferă doar răspunsuri de la 0..lățime și 0..înălțime. Vreo idee cum se rezolva asta?