나의 질문과 유사 하는 방법이 올바른 위치의 픽셀에서 마우스 좌표?, 추가 주의 이미지가 잠재적으로 TransformedBitmap
는 곳,대칭과 회전이 적용될 수있다,과 픽셀의 좌표를 선명한 이미지를 제공합니다.
나 Window
의인은 다음과 같다:
<DockPanel>
<Label DockPanel.Dock="Bottom" Name="TheLabel" />
<Image DockPanel.Dock="Top" Name="TheImage" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" MouseMove="TheImage_MouseMove" />
</DockPanel>
고 코드 숨김 다음과 같습니다:
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();
}
면에서 오른쪽 하단(는 파란색으로 쉽게 추적하는)의 non-변환,이미지를 올바르게 참조 좌표가(~4,~3)는 이미지 크기입니다.
그러나,당신을 적용하면 변형,예를 들어 변경 TheImage.Source = bs;
하기 TheImage.Source = new TransformedBitmap(bs, new RotateTransform(90.0));
유혹,블루 대신에게(~4,~0)입니다.
나는 생각 중 하나 볼 수있는 실제 매트릭스 값의 변형,그리고 결정하는 방법을 조정하는 지점에는 모든 다양한 경우에,그러나 그것은 수하는 간편한 솔루션을 사용하여 inverse transform.
Image
에Grid
는 배경과 이동MouseMove
이벤트Grid
픽셀 좌표가 더 이상 정확하지 않을 때의 범위 밖에 있는 이미지 때문에 그것은 단지 대한 답변을 제공하 0..폭 0..높이입니다. 어떤 아이디어를 수정하는 방법 이?