如何从鼠标坐标中获得正确的像素位置



我正在使用e.GetPosition获取鼠标坐标。当它接近0时,它会返回正确的坐标,然而,我从图像右上角点击得越远,它就越不准确。

我想能够点击一个像素并改变它的颜色。但现在它改变了另一个像素,而不是我点击的那个像素(0,0除外(。

private void image_MouseDown(object sender, MouseButtonEventArgs e)
{
// coordinates are now available in p.X and p.Y
var p = e.GetPosition(image);
System.Drawing.Color red = System.Drawing.Color.FromArgb(255, 0, 0);
//converting to bitmap
MemoryStream outStream = new MemoryStream();
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(wBitmap));
enc.Save(outStream);
System.Drawing.Bitmap img = new System.Drawing.Bitmap(outStream);
//calculating pixel position
double pixelWidth = image.Source.Width;
double pixelHeight = image.Source.Height;
double dx = pixelWidth * p.X / image.ActualWidth;
double dy = pixelHeight * p.Y / image.ActualHeight;
//converting to int
int x = Convert.ToInt32(dx);
int y = Convert.ToInt32(dy);

img.SetPixel(x, y, red);
//putting it back to writable bitmap and image    
wBitmap = BitmapToImageSource(img);
image.Source = wBitmap;
}

像素发生变化的图像

我想在图像中更改一个像这样的像素。然而,它并没有改变我点击的像素,而是更高一点的另一个像素。

为了获得Image元素上鼠标事件的Source位图内的像素位置,您必须使用BitmapSource的PixelWidthPixelHeight,而不是Width和Height:

private void ImageMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var image = (Image)sender;
var source = (BitmapSource)image.Source;
var mousePos = e.GetPosition(image);
var pixelX = (int)(mousePos.X / image.ActualWidth * source.PixelWidth);
var pixelY = (int)(mousePos.Y / image.ActualHeight * source.PixelHeight);
...
}

最新更新