将控件保存为图片

将控件内容保存成图片 将控件内容保存成图片,即使控件区域被其它窗口遮挡住也会将整个控件保存下来。 命名空间: using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; API声明: [DllImportAttribute("gdi32.dll")] private static extern bool BitBlt( IntPtr hdcDest, int nXDest, 阅读详情

这里分别提供win form 和 wpf 两种方式

对于.net 2.0 我们可以简单地利用 BitBlt 函数来实现,非常简单,代码如下:

    public static class ControlToImageConverter
    {
        private const Int32 SRCCOPY = 0xCC0020;

        [DllImport("gdi32.dll")]
        internal static extern bool BitBlt(
            IntPtr hdcDest, // handle to destination DC
            int nXDest, // x-coord of destination upper-left corner
            int nYDest, // y-coord of destination upper-left corner
            int nWidth, // width of destination rectangle
            int nHeight, // height of destination rectangle
            IntPtr hdcSrc, // handle to source DC
            int nXSrc, // x-coordinate of source upper-left corner
            int nYSrc, // y-coordinate of source upper-left corner
            Int32 dwRop // raster operation code
            );

        public static Bitmap GetImageOfControl(Control control)
        {

            var w = control.Size.Width;
            var h = control.Size.Height;

            Graphics gOfCtrl = control.CreateGraphics();
            var bmp = new Bitmap(w, h, gOfCtrl);

            Graphics gOfBmp = Graphics.FromImage(bmp);

            IntPtr dc1 = gOfCtrl.GetHdc();
            IntPtr dc2 = gOfBmp.GetHdc();

            BitBlt(dc2, 0, 0, w, h, dc1, 0, 0, SRCCOPY);

            gOfCtrl.ReleaseHdc(dc1);
            gOfBmp.ReleaseHdc(dc2);

            gOfCtrl.Dispose();
            gOfBmp.Dispose();

            return bmp;
        }

    }

其中 SRCCOPY  =   0xCC0020, 表示将源直接拷贝到目标。

 

对于WPF,无法获得控件的hdc, 所以不能使用bitblt函数了,但幸运的是,其提供了一个RenderTargetBitmap的类型,可以将控件绘制到改类型的类型是示例上,比如:

var renderBitmap = 
         new RenderTargetBitmap(w, h, 96d,96d, PixelFormats.Pbgra32);

renderBitmap.Render(controlToConvert);


 其可以直接作为Image控件的源以便显示,如果要将其保存下来(保存到流中),则需要用到BitmapEncoder, 将上面的位图添加到encoder的帧中,然后调用save方法便可。

包装好的代码如下:

 

    internal enum ImageType
    {
        Bmp,
        Gif,
        Jpeg,
        Png,
        Tiff,
        Wdp
    }

    internal static class ControlToImageConverter
    {

        /// <summary>
        /// Convert any control to a PngBitmapEncoder
        /// </summary>
        /// <param name="controlToConvert">The control to convert to an ImageSource</param>
        /// <param name="imageType">The image type will indicate the type of return bitmap encoder</param>
        /// <returns>The returned ImageSource of the controlToConvert</returns>
        private static BitmapEncoder GetImageFromControl(FrameworkElement controlToConvert, ImageType imageType)
        {

            var bounds = controlToConvert.GetBounds(controlToConvert.Parent as Visual);

            var renderBitmap = new RenderTargetBitmap((Int32)bounds.Width, (Int32)bounds.Height, 96d,
                                                      96d, PixelFormats.Pbgra32);
            renderBitmap.Render(controlToConvert);

            BitmapEncoder encoder = GetBitmapEncoderByImageType(imageType);

            // puch rendered bitmap into it
            encoder.Frames.Add(BitmapFrame.Create(renderBitmap));

            return encoder;
        }

        private static Rect GetBounds(this FrameworkElement element, Visual from)
        {
            Rect rect = Rect.Empty;

            try
            {
                GeneralTransform transform = element.TransformToVisual(from);
                rect = transform.TransformBounds(new Rect(0, 0, element.ActualWidth, element.ActualHeight));
                // ReSharper disable EmptyGeneralCatchClause
            }
            catch
            // ReSharper restore EmptyGeneralCatchClause
            {

            }

            return rect;
        }

        /// <summary>
        /// Get an encoder by a specify image type
        /// </summary>
        /// <param name="type">the image type</param>
        /// <returns>return an eccoder</returns>
        private static BitmapEncoder GetBitmapEncoderByImageType(ImageType type)
        {
            switch (type)
            {
                case ImageType.Bmp:
                    return new BmpBitmapEncoder();
                case ImageType.Gif:
                    return new GifBitmapEncoder();
                case ImageType.Jpeg:
                    return new JpegBitmapEncoder();
                case ImageType.Png:
                    return new PngBitmapEncoder();
                case ImageType.Tiff:
                    return new TiffBitmapEncoder();
                case ImageType.Wdp:
                    return new WmpBitmapEncoder();
                default:
                    return new PngBitmapEncoder();
            }
        }

        /// <summary>
        /// Get the iamge type by image file name
        /// </summary>
        /// <param name="fileName">the file name of an image</param>
        /// <returns>the iamge type</returns>
        private static ImageType GetImageTypeByFileName(string fileName)
        {
            ImageType returnType = ImageType.Png;

            var extension = Path.GetExtension(fileName);
            if (!String.IsNullOrEmpty(extension))
            {
                switch (extension.ToLower())
                {
                    case ".bmp":
                        returnType = ImageType.Bmp;
                        break;
                    case ".gif":
                        returnType = ImageType.Gif;
                        break;
                    case ".jpeg":
                    case ".jpg":
                    case ".jpe":
                    case "jfif":
                        returnType = ImageType.Jpeg;
                        break;
                    case ".png":
                        returnType = ImageType.Png;
                        break;
                    case ".tiff":
                    case ".tif":
                        returnType = ImageType.Tiff;
                        break;
                    case ".wdp":
                        returnType = ImageType.Wdp;
                        break;
                    default:
                        returnType = ImageType.Png;
                        break;
                }
            }

            return returnType;
        }

        /// <summary>
        /// Get an ImageSource of a control
        /// </summary>
        /// <param name="controlToConvert">The control to convert to an ImageSource</param>
        /// <param name="imageType">the image type</param>
        /// <returns>The returned ImageSource of the controlToConvert</returns>
        public static BitmapSource GetImageOfControl(FrameworkElement controlToConvert, ImageType imageType)
        {
            // return first frame of image 
            var encoder = GetImageFromControl(controlToConvert, imageType);
            if (encoder != null && encoder.Frames != null && encoder.Frames.Count > 0)
            {
                return encoder.Frames[0];
            }

            return new BitmapImage();
        }

        /// <summary>
        /// Get an ImageSource of a control(Jpeg as default type)
        /// </summary>
        /// <param name="controlToConvert">The control to convert to an ImageSource</param>
        /// <returns>The returned ImageSource of the controlToConvert</returns>
        public static BitmapSource GetImageOfControl(FrameworkElement controlToConvert)
        {
            return GetImageOfControl(controlToConvert, ImageType.Jpeg);
        }

        /// <summary>
        /// Save an image of a control
        /// </summary>
        /// <param name="controlToConvert">The control to convert to an ImageSource</param>
        /// <param name="fileName">The location to save the image to</param>
        /// <returns>The returned ImageSource of the controlToConvert</returns>
        public static Boolean SaveImageOfControl(FrameworkElement controlToConvert, String fileName)
        {
            try
            {
                var imageType = GetImageTypeByFileName(fileName);

                using (var outStream = new FileStream(fileName, FileMode.Create))
                {
                    var encoder = GetImageFromControl(controlToConvert, imageType);
                    encoder.Save(outStream);
                }
            }
            catch (Exception e)
            {
#if DEBUG
                Console.WriteLine("Exception caught saving stream: {0}", e.Message);
#endif
                return false;
            }

            return true;
        }

    }

 

注意到上面的GetImageOfControl方法返回的实际是BitmapFrame, 其是BitmapSource的一种,如果你更习惯使用BitmapImage的话,免费赠送如下方法:

        public static BitmapImage ToBitmapImage(this BitmapSource bitmapSource)
        {
            var encoder = new JpegBitmapEncoder();
            var memoryStream = new MemoryStream();

            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
            encoder.Save(memoryStream);

            var bmp = new BitmapImage();

            bmp.BeginInit();
            bmp.StreamSource = new MemoryStream(memoryStream.ToArray());
            bmp.EndInit();

            memoryStream.Flush();
            memoryStream.Close();

            return bmp;
        }

 
UWP 实现保存image控件图片到本地 实现代码如下: private async void save_image(string desiredName) { StorageFolder applicationFolder = ApplicationData.Current.LocalFolder; StorageFolder folder = await applica... 阅读详情

相关推荐

pb powerbuilder 截图 截取图片 数据窗 截屏控制

可直接将数据窗口,截取图片,保留原始文件! 非常好用、实用!

将控件内容转成图片保存

下面提供几种将控件上的内容转成bitmap的方式,根据需要选用 一imageview  转bitmap  Bitmap image = ((BitmapDrawable)imageView.getDrawable()).getBitmap();    二  可以控制大小 private static Bitmap convertViewToBitmap(View view)

u013134722的博客 2001

Agent测试框架Harbor指南

Harbor是一个AI Agent单元测试框架,用于自动化测试AI代理在容器环境中的任务执行能力。它支持18+种AI代理,通过沙箱隔离和自动验证机制评估任务完成情况。任务必须具有可编程验证的输出结果,适合代码、数据、系统等可量化任务,不适合创意写作等主观任务。Harbor采用CLI操作方式,核心架构包含Job管理、Trial执行和验证器三个层级,执行流程包括环境启动、Agent执行和结果验证。任务目录包含指令文件、配置文件、Docker环境定义和测试脚本等必需组件,通过测试脚本自动判断任务完成质量。

loo_Charles_ool的博客 1388

WebBrowser控件保存图片至Picturebox控件

WebBrowser控件保存图片至Picturebox控件首先要建WebBrowser与Picturebox控件各一个然后设置WebBrowser.navigate url            (这个url变量为有图片的你要打开的网页的网址)imgurl=""                             (imgurl是一个您要下载的图片的网址)然后在form里面

gseven888的专栏 3852

RandLA-Net复现SemanticKITTI和S3DIS数据集

RandLA-Net复现KITTI和室内数据集

weixin_48845174的博客 4109

Python高效转换病理图像:从mrxs到SVS的完整实践指南

本文提供了使用Python将数字病理切片从mrxs格式高效转换为SVS格式的完整实践指南。针对mrxs格式兼容性差的问题,文章详细解析了基于openslide和tifffile库的核心转换流程,并重点分享了应对大内存消耗的优化方案与流式处理技巧,确保转换后的SVS文件保留多分辨率金字塔结构,兼容主流病理分析工具。

weixin_29051811的博客 547

在WPF中保存控件内容为图片

因为这里只支持保存到流,不支持直接保存到文件,所以需要先创建文件,再进行保存。),已经介绍了控件、面板、形状都是继承自Visual类,所以都可以用于Render函数渲染。代表图像编码过的帧。像JPG、BMP这样的静态图像,整个图像只有一帧。类是表示由解码器返回并被编码器接受的图像数据。只要是Visual对象,都可以进行渲染。类的,所以我们这里选择的是第三种重载。这里具体介绍一下这两个类。对象的集合编码为图像流。在WPF介绍这篇文章中(),可以设置图像内各帧。,所以可以直接用于设置。* 通过Uri来创建。

【微软MVP】zhaotianff的专栏 1402

jenkins安装、打包、部署

一个可以让小白部署发布项目的软件;git 配置 一定要配置git的命令路径jenkins启动命令,一定要加这一段 -Dhudson.util.ProcessTree.disable=true一定要配置jenkins的节点,BUILD_ID和DONTKILLME 否则会导致打包后,会将运行的java程序进程也杀死创建任务SSH中执行服务器B的命令的时候,cd /opt;一定要cd 打开那个目录,否则文件无法传输过去。

学海无涯,我用JAVA 5214

WPF下保存控件内容为图片

1、选取要绑定的控件名称 2、设置保存图片的类型和格式、路径 //保存图片处理事件 private void Save_image_Click(object sender, RoutedEventArgs e) { string outputfile="";//文件保存路径声明 Syste...

灰太狼的小秘密 2629

基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南:从硬件设计到软件配置

本文提供了一份详细的基于ESP32-S3与PCM5102的HiFi网络收音机复刻指南。内容涵盖从核心硬件选型(如ESP32-S3主控与PCM5102 DAC芯片)、四路独立LDO供电设计,到软件环境配置、固件烧录及常见问题调试的全过程,旨在帮助创客打造一台支持网络电台、本地播放与蓝牙连接的高保真音频播放器。

weixin_30632267的博客 184

KEITHLEY 2182A + 6220/6221 系列测试系统软件

6221型与2182A型相结合,是业界最完整的差分电导测量解决方案

业余程序员小徐的博客 2985

WPF 保存image控件里的图片

WPF 保存image控件里的图片 原文:WPF 保存image控件里的图片 string ProImgPath = ProcessPath + name + ".png";//要保存的图片的地址,包含文件名 BitmapSource BS = (BitmapSource)ImgPro.Source; PngBitmapEncoder P...

weixin_30412167的博客 786

PyMiMi实战指南:midas_api配置与连接测试详解

本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。

weixin_29044713的博客 684

MFC中将控件保存成图片 && MFC中利用GDI+在控件上绘图,把图像保存成图片

一、VC中将控件保存成图片/****函数功能:将VC中将控件保存成图片****/void OnBtnPRINT() {// TODO: Add your control notification handler code hereCClientDC SHDC(m_graph.GetDlgItem(IDC_CWG));//CClientDC中传递的参数为控件CWnd指针;如果打印的图...

ZHANGRUONAN1991的博客 592

5、AIX系统硬件管理与故障诊断全解析

本文全面解析了AIX系统的硬件管理与故障诊断方法,涵盖系统管理服务(SMS)的使用、设备兼容性配置、设备配置数据库结构、常用命令如cfgmgr、lsattr、smitty devices的操作详解,并深入介绍了错误日志管理机制,包括errdemon、errpt、errlogger等命令的应用。通过实际案例分析和流程图展示,帮助系统管理员掌握从问题怀疑到诊断执行再到日志清理的完整流程,同时提供注意事项与最佳实践,助力AIX系统的稳定运行与高效维护。

y2z3a4b5c的博客 61

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

将图片控件中的图片保存为图片文件BMP、JPG、PNG、GIF、TIFF

将图片控件中的图片保存为图片文件调用例子函数例子 本例函数可以将图片控件中的图片,保存为多种图片文件格式, 调用例子 Dim FlName As String FlName = Application.GetSaveAsFilename("二维码图片_" & Format(Now(), "yyyymmddhhmm"), "图片文件(*.jpg),*.jpg", , "保存二维码为图片") If FlName = "False" Then MsgBox "二维码图片未保存", vbInformatio

w_dexu的博客 1049

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从网络中获取图片显示到Image控件并保存到磁盘

一、从网络中获取图片信息: 1 /// <summary> 2 /// 获取图片 3 /// </summary> 4 /// <param name="url">Url</param> 5 /// <returns>BitmapImage&l...

weixin_34380948的博客 606

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

winForm 将控件 保存成图片方法

此外,还可以通过Graphics类的CopyFromScreen方法将屏幕的指定区域拷贝到指定位图中,只是这种方式对窗口类比较适用,而且会保留窗口的阴影部分,因此对于截取控件图片不是很完美。Winform将控件保存为图片比较简单,因为Control类本身就有DrawToBitmap方法,可以将控件本身输出到图片中。

weixin_40029679的博客 427

QWidget QPixmap 截取控件并保存为图片

一、功能 void QWidget::render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackgro...

zhanghw的博客 5517

VC中如何将控件保存为图片

第一种方法: void CItouziDlg::OnBnClickedSave() { HBITMAP hBitmap   =   NULL;   //创建位图段   BITMAPINFO bmi;   LPBYTE pBits;   ZeroMemory(&bmi,sizeof(bmi));   //IDC_CHARTCTRL为控件变量名(可以是任何控件!)   CDC *p

予衡飞翔 1441

保存MFC中picture control 控件的图片

前段时间需要用到保存picture control控件的图片,在网上找了很久都不是自己需要的,所以自己整了一个,分享给需要的人 //保存picture control控件的图片, 参数ID是picture control控件ID号 void CTransferDlg::OnPictureSave(UINT ID) { CWnd* bmpShow = GetDlgItem(ID); ...

Qzx 5611
上一篇: 数改善WPF应用程序性能的10大方法
下一篇: 用WPF轻松打造iTunes CoverFlow效果
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值