我的問題類似于
但是,一旦您應用變換,例如更改TheImage.Source = bs;為TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));,將滑鼠懸停在藍色上會給出 (~4, ~0)。

我認為可以查看變換的實際矩陣值,并確定如何在所有各種情況下調整點,但似乎使用逆變換應該有更簡單的解決方案。
uj5u.com熱心網友回復:
當 Image 元素呈現 TransformedBitmap 時,實際上會忽略 Transform 的中心點,并將位圖移動到適當的坐標范圍內。
由于這種轉變不適用于點的變換,因此您必須對其進行補償,例如:
var p = e.GetPosition(TheImage);
if (TheImage.Source is BitmapSource bs)
{
p = new Point(
p.X * bs.PixelWidth / TheImage.ActualWidth,
p.Y * bs.PixelHeight / TheImage.ActualHeight);
if (TheImage.Source is TransformedBitmap tb)
{
var w = tb.Source.PixelWidth;
var h = tb.Source.PixelHeight;
p = tb.Transform.Inverse.Transform(p);
p = new Point((p.X w) % w, (p.Y h) % h);
}
TheLabel.Content = $"x: {(int)p.X}, y: {(int)p.Y}";
}
但是,當轉換中心設定為(0,0).
為了使其適用于具有任意中心點的變換,您必須清除變換矩陣中的偏移值:
var p = e.GetPosition(TheImage);
if (TheImage.Source is BitmapSource bs)
{
p = new Point(
p.X * bs.PixelWidth / TheImage.ActualWidth,
p.Y * bs.PixelHeight / TheImage.ActualHeight);
if (TheImage.Source is TransformedBitmap tb)
{
var w = tb.Source.PixelWidth;
var h = tb.Source.PixelHeight;
var t = tb.Transform.Value;
t.Invert();
t.OffsetX = 0d;
t.OffsetY = 0d;
p = t.Transform(p);
p = new Point((p.X w) % w, (p.Y h) % h);
}
TheLabel.Content = $"x: {(int)p.X}, y: {(int)p.Y}";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365011.html
