WPF如何实现对自定义控件或区域的截图

第一种方法,简单粗暴,但是有个问题,有些控件如果用了winform里的控件来承载,截图显示不了其中的内容,比如视频图像。

                System.Windows.Media.Imaging.RenderTargetBitmap targetBitmap = new System.Windows.Media.Imaging.RenderTargetBitmap((int)this.MulPlayerController.ActualWidth, (int)this.MulPlayerController.ActualHeight, 96d, 96d, System.Windows.Media.PixelFormats.Default);
                targetBitmap.Render(this.gridChilren);
                System.Windows.Media.Imaging.PngBitmapEncoder saveEncoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
                saveEncoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(targetBitmap));
                string tempFile = System.IO.Path.GetTempFileName() + ".png";
                System.IO.FileStream fs = System.IO.File.Open(tempFile, System.IO.FileMode.OpenOrCreate);
                saveEncoder.Save(fs);
                fs.Close();

第二种方法,思路是先将整个屏幕截取下来,如何获得你想要截图区域的坐标和宽高,然后将屏幕中对应的位置区域保存为图片就可以了。

                //获得当前屏幕的分辨率            
                Screen scr = Screen.PrimaryScreen;
                System.Drawing.Rectangle rc = scr.Bounds;
                int iWidth = rc.Width;
                int iHeight = rc.Height;
                //创建一个和屏幕一样大的Bitmap            
                System.Drawing.Image myImage = new System.Drawing.Bitmap((int)this.MulPlayerController.pnlMain.ActualWidth, (int)this.MulPlayerController.pnlMain.ActualHeight);
                //从一个继承自Image类的对象中创建Graphics对象            
                System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(myImage);
                Point controlPoint = new Point(0, 0);
                controlPoint = this.MulPlayerController.pnlMain.PointToScreen(controlPoint);//获取控件相对于屏幕的位置
                //抓屏并拷贝到myimage里            
                g.CopyFromScreen(new System.Drawing.Point((int)controlPoint.X, (int)controlPoint.Y), new System.Drawing.Point(0, 0), 
                    new System.Drawing.Size((int)this.MulPlayerController.pnlMain.ActualWidth, (int)this.MulPlayerController.pnlMain.ActualHeight));
                //保存为文件         
                myImage.Save("1.jpg");
                string tempFileImg = "1.jpg";
WPF中,可以通过自定义控件实现ROI(Region of Interest)功能。ROI是指在图像或界面中选择感兴趣的区域,通常用于目标检测、图像处理等应用中。 在WPF中,可以使用Prism框架的MVVM方式来实现自定义控件的ROI功能。可以使用控件模板(ItemsControl)、可拖动控件(Thumb)、装饰器(Adorner)等来实现。同时,可以使用CommandParameter来传递多个参数,使用GetChildObjectByUid方法来查找特定类型的子控件。 具体的代码示例可以参考以下代码: ```xml <StackPanel Orientation="Horizontal"> <!--FlowDirection默认值为LeftToRight--> <Image x:Name="img" Width="150" Height="100" Margin="10" Source="./huahua.png" Stretch="Fill" FlowDirection="LeftToRight" Cursor="ScrollAll" Opacity="0.7"/> <!--FlowDirection流动方向设置为RightToLeft--> <Image x:Name="img2" Width="150" Height="100" Margin="10" Source="pack://application:,,,/huahua.png" Stretch="Fill" FlowDirection="RightToLeft" Cursor="Hand"/> <!--Source的路径不建议使用磁盘地址--> <Image x:Name="img3" Width="150" Height="100" Margin="10" RenderTransformOrigin="0.5,0.5" Source="Pack://application:,,,/WPFControlsTest;component/huahua.png" Stretch="Fill" > <Image.RenderTransform> <TransformGroup> <RotateTransform Angle="180" CenterX="0" CenterY="0"/> <ScaleTransform ScaleX="1.1" ScaleY="1.1"/> <TranslateTransform X="50" Y="50"/> </TransformGroup> </Image.RenderTransform> </Image> </StackPanel> ``` 以上代码展示了如何设置固定大小的图片,并在其中应用了旋转、缩放和平移的变换效果。通过设置不同的属性和参数,可以实现自定义控件的ROI功能。 #### 引用[.reference_title] - *1* *2* [WPF Prism MVVM【动态添加控件并可用鼠标、拖动、缩放、旋转】](https://blog.csdn.net/redfox6843/article/details/126117819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [WPF 控件专题 Image控件详解](https://blog.csdn.net/BYH371256/article/details/125327082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值