WPF实现一个图片查看器

我想实现一个图片查看器

  • 鼠标滚轮可以放大缩小
  • 鼠标左键可以拖动图片
  • 鼠标右键定位到当前真实的图片坐标(这是我项目要求)

根据参考
如何从MouseEvent中获取图像的X和Y点?

WPF中获取Image的位置和大小

<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;
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值