我想实现一个图片查看器
- 鼠标滚轮可以放大缩小
- 鼠标左键可以拖动图片
- 鼠标右键定位到当前真实的图片坐标(这是我项目要求)
<Grid x:Name="IMG" Background="Black" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0">
<Grid.Resources>
<TransformGroup x:Key="Imageview">
<ScaleTransform/>
<TranslateTransform/>
</TransformGroup>
</Grid.Resources>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Disabled" Background="SkyBlue" Cursor="SizeAll"
Focusable="False" x:Name="BackFrame">
<ContentControl MouseLeftButtonDown="IMG1_MouseLeftButtonDown"
MouseLeftButtonUp="IMG1_MouseLeftButtonUp"
MouseRightButtonDown="IMG1_MouseRightButtonDown"
MouseRightButtonUp="IMG1_MouseRightButtonUp"
MouseMove="IMG1_MouseMove"
MouseWheel="IMG1_MouseWheel">
<Image Name="IMG1" Source="{Binding window.ImageFullName}" RenderTransform="{StaticResource Imageview}" Stretch="Uniform" RenderOptions.BitmapScalingMode="NearestNeighbor" ></Image>
</ContentControl>
</ScrollViewer>
</Grid>
private bool mouseDown;
private Point mouseXY;
private System.Drawing.Point bitmapXY;
private void IMG1_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
System.Windows.Point p = e.GetPosition(IMG1);
double pixelWidth = IMG1.Source.Width;
double pixelHeight = IMG1.Source.Height;
double x = pixelWidth * p.X / IMG1.ActualWidth;
double y = pixelHeight * p.Y / IMG1.ActualHeight;
bitmapXY = new System.Drawing.Point((int)x, (int)y);
SetPixel(bitmapXY, MAX);
}
private void IMG1_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
IMG1.ReleaseMouseCapture();
}
private void IMG1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
img.CaptureMouse();
mouseDown = true;
mouseXY = e.GetPosition(img);
}
//鼠标按下时的事件,启用捕获鼠标位置并把坐标赋值给mouseXY.
private void IMG1_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
img.ReleaseMouseCapture();
mouseDown = false;
}
//鼠标松开时的事件,停止捕获鼠标位置。
private void IMG1_MouseMove(object sender, MouseEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
if (mouseDown)
{
Domousemove(img, e);
}
}
//鼠标移动时的事件,当鼠标按下并移动时发生
//Domousemove(img, e); 函数
private void Domousemove(ContentControl img, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed)
{
return;
}
var group = IMG.FindResource("Imageview") as TransformGroup;
var transform = group.Children[1] as TranslateTransform;
var position = e.GetPosition(img);
transform.X -= mouseXY.X - position.X;
transform.Y -= mouseXY.Y - position.Y;
mouseXY = position;
}
//group.Children中的第二个是移动的函数
//它根据X.Y的值来移动。并把当前鼠标位置赋值给mouseXY.
private void IMG1_MouseWheel(object sender, MouseWheelEventArgs e)
{
var img = sender as ContentControl;
if (img == null)
{
return;
}
var point = e.GetPosition(img);
var group = IMG.FindResource("Imageview") as TransformGroup;
var delta = e.Delta * 0.01;
DowheelZoom(group, point, delta);
}
//鼠标滑轮事件,得到坐标,放缩函数和滑轮指数,由于滑轮值变化较大所以*0.001.
private void DowheelZoom(TransformGroup group, Point point, double delta)
{
var pointToContent = group.Inverse.Transform(point);
var transform = group.Children[0] as ScaleTransform;
if (transform.ScaleX + delta < 0.1) return;
transform.ScaleX += delta;
transform.ScaleY += delta;
var transform1 = group.Children[1] as TranslateTransform;
transform1.X = -1 * ((pointToContent.X * transform.ScaleX) - point.X);
transform1.Y = -1 * ((pointToContent.Y * transform.ScaleY) - point.Y);
}
下面这是对右键点的地方进行标红处理的代码
private Bitmap Bitmap;
private void SetPixel(System.Drawing.Point centerPoint, int max)
{
Bitmap imgtarget = Bitmap.Clone(new System.Drawing.Rectangle(0, 0, Bitmap.Width, Bitmap.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
imgtarget.SetPixel(centerPoint.X,centerPoint.Y,Color.Red);
var ip = imgtarget.GetHbitmap();
var bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
IMG1.Source = bs;
}