CImg库中CImg,CImgList,CImgDisplay三个类的介绍
转自:http://www.cppprog.com/2009/0426/108.html
本文简单介绍了CImg库中的三个大类:CImg,CImgList,CImgDisplay。然后给出了让CImg在HDC上绘图以及与HBITMAP互换的方法,为部署CImg到Windows GUI程序中提供了基本支持。
上回介绍了CImg模板类的一些函数,象我这种不在图像处理行业混的人来说很多术语实在是太专业了-_-,不理不理,看不懂就直接写测试代码看它们的作用是什么不就知道啦~~嘿嘿^_^。
上测试代码先:
- #include "CImg.h"
- using namespace cimg_library;
- int main()
- {
- CImg<unsigned char> src("test.bmp");
- // 设置原图大小,貌似haar计算要求图像宽高是4的倍数
- src.resize( src.width-src.width%4, src.height-src.height%4);
- CImgList<unsigned char> visu;
- visu
- <<src.get_crop(0,0,src.width/2,src.height/2)
- <<src.get_quantize(5)
- <<src.get_rotate(45,1)
- <<src.get_permute_axes("yxzv")
- <<src.get_erode(5)
- <<src.get_haar()
- <<src.get_dilate(3)
- <<src.get_blur(3)
- <<src.get_noise(3)
- <<src.get_deriche(3)
- <<src.get_blur_anisotropic(8)
- <<src.get_blur_bilateral(1,2)
- <<src.get_blur_patch(4,3)
- <<src.get_sharpen(3)
- <<src.get_blur_median(3)
- ; //如果愿意可以测试更多CImg的图像处理方法
- // 用来显示效果
- CImgDisplay disp(src.width*2, src.height);
- int i=0;
- unsigned char textcolor[] = { 255,255,255 };
- while(!disp.is_closed && !disp.is_keyQ && !disp.is_keyESC)
- {
- i = i % visu.size;
- char buf[20];
- ::sprintf(buf,"img:%d",i);
- //显示效果,(CImg << CImg)会生成一个新的CImgList
- //左边是原图,右边是处理图,外加写了个序号在上面以便区别
- disp.display( src << (+visu[i]).draw_text(0,0,buf,textcolor) ).wait();
- //按方向键下则显示下一个
- if(disp.is_keyARROWDOWN) i++;
- //方向键上则显示上一个
- if(disp.is_keyARROWUP)
- {
- i--;
- if(i<0) i=visu.size-1;
- }
- }
- return 0;
- }
这个例子用到了CImg、CImgList、CImgDisplay三个类。
CImg类前面已有介绍。
CImgList是CImg的容器,用来保存一组CImg,主要方法有:
- CImgList<T>& remove(const unsigned int pos) //删除指定位置
- CImgList<T>& pop_back() //删除最后一个
- CImgList<T>& pop_front() //删除前端
- CImgList<T>& push_back(const CImg<t>& img)//从后面添加
- CImgList<T>& push_front(const CImg<t>& img)//从前面添加
- CImgList<T>& insert(const CImg<t>& img, const unsigned int pos) //插入到指定位置之前
- CImgList<T>& clear() //清空
- CImg<T>& operator[](const unsigned int pos) //取指定位置的图像
上面这些是它作为容器的基本功能,同时它也重载了一些操作符以便于使用,比如本例中的"<<"操作其实就是push_back方法。另外,它还有大量的运算功能用于给容器中的图像批量运算。最后,还有一些好玩的方法不可错过:从视频中载入或把图像保存到视频中:
- CImgList<T>& load_ffmpeg(const char *const filename,
- const unsigned int first_frame=0,
- const unsigned int last_frame=~0U,
- const unsigned int step_frame=1,
- const bool pixel_format=true,
- const bool resume=false)
- const CImgList<T>& save_ffmpeg(
- const char *const filename,
- const unsigned int first_frame=0,
- const unsigned int last_frame=~0U,
- const unsigned int fps=25)
这两个方法要求链接ffmpeg库,如果没有这个库文件,还可以使用load_ffmpeg_external和save_ffmpeg_external方法调用已外部安装的ffmpeg程序编解码。
CImgDisplay类是一个窗口类,它主要用来显示CImg和CImgList。一般使用它的流程是:
- 新建CImgDisplay对象
- 设置它的大小,除直接输入宽高外也能用直接用CImg、CImgList或另一个CImgDisplay对象作为调整大小的依据。这时,CImgDisplay对象内部已经建立了一个窗口了。
- 使用display方法显示图像
- 使用wait方法等待事件发生(键盘、鼠标、超时等)
- 检查is_keyXXXX、is_closed、button、wheel等成员变量确定是什么事件,再决定我们该做什么操作。
- 如果需要,循环回第三步
- 析构时窗口收回。
在本例中,如果窗体关闭或按了Q键或按了ESC键则退出循环,程序结束。或者显示由原图和处理后的图组成的CImgList图像,如果按了上下方向键,则改变当前显示的处理图。
这是本例运行时的截图:
水墨画风格的《清明上河图》
CImg的图像处理方法绝不止上面例子中写的那么一点点,如果都写上去的话光运算就得等很长的时间,内存资源就更不用说了。所以建议大家一批批地写上去试验。或者可以修改一下代码,用逐次运算来试验效果。当然,如果你是图像处理领域的大牛,看方法名应试就知道是干啥的了,上面的代码就当熟悉一下CImg库吧。
在Windows里使用CImg
现在,我们已经可以使用CImg的现成方法做一些图像处理了。不过,有一个大问题需要解决,怎样把CImg的强大功能和我们的GUI程序相结合呢?我们总不能只使用CImgDisplay作为最终产品的显示界面吧?我们急需一个把CImg显示到指定HDC上的方法!
好在CImg库就一个头文件,所有的源代码都在这个头文件里。只要看一下它是怎么把CImg对象显示到CImgDisplay上的,我们就能依样画葫芦地把它显示到指定HDC上。
经过一番摸索,终于发现可以这样把一个CImg对象显示到HDC上:
- template<class T>
- void DrawToHDC(HDC dc, const CImg<T> &src)
- {
- CImgDisplay disp;
- disp.assign(src,0,3,false,true); //最后一个true指明m_disp不要显示
- disp.render(m_src); //把src的内容解析到disp的data中
- SetDIBitsToDevice(dc,0,0,disp.width,disp.height,0,0,
- 0,disp.height,disp.data,&disp.bmi,DIB_RGB_COLORS);
- }
CImgDisplay在显示过程中会填充bmi和data成员变量,而这两个变量正好是DIB数据,这段代码正好利用了这点。
但是它的运行效率实在是不怎样,经调试发现disp.assign方法会生成窗体、互斥量等东东,析构时又要删除它们,我们在这里根本用不着这些东西,浪费啊~~,于是不得不写一个新的画图方法了。
在说新版本的画图方法之前,得先说一下CImg库的另一个好功能:插件支持。只要在#include "CImg.h"之前
#define cimg_plugin "插件文件"
#define cimg_plugin1 "插件文件1"
#define cimg_plugin2 "插件文件2"
...
#define cimg_plugin8 "插件文件8"
CImg库就会把插件文件中的方法加入到CImg类中,看来起很酷,其实工作原理很简单,头文件中CImg类是这样定义的:
- template<typename T>
- struct CImg {
- ...
- #ifdef cimg_plugin
- #include cimg_plugin
- #endif
- #ifdef cimg_plugin1
- #include cimg_plugin1
- #endif
- #ifdef cimg_plugin2
- #include cimg_plugin2
- #endif
- #ifdef cimg_plugin3
- #include cimg_plugin3
- #endif
- #ifdef cimg_plugin4
- #include cimg_plugin4
- #endif
- #ifdef cimg_plugin5
- #include cimg_plugin5
- #endif
- #ifdef cimg_plugin6
- #include cimg_plugin6
- #endif
- #ifdef cimg_plugin7
- #include cimg_plugin7
- #endif
- #ifdef cimg_plugin8
- #include cimg_plugin8
- #endif
- ...
- }
当我们如下定义时
#define cimg_plugin "cimg4hdc.h"
cimg4hdc.h"
cimg4hdc.h文件的内容就插入到了CImg类的定义中间。
我们现在就可以写一个插件文件为CImg类加入与Windows GUI交互的方法了,下面的代码是我写的插件文件,文件名为“cimg4hdc.h”,新加了五个方法:
- HBITMAP to_bmp(HDC dc = 0) const // 从CImg产生一个HBITMAP,使用完要记得DeleteObject
- CImg<T>& display(HDC dc, RECT &rc) // 把CImg显示到HDC上,rc指定显示位置和大小
- CImg(HBITMAP bmp) // 从HBITMAP直接生成一个CImg,HBITMAP必须是16位色以上
- CImg<T>& assign(HBITMAP bmp) // 同上
- CImg<T>& load_bmp(HBITMAP bmp) // 同上
插件文件代码(点击下载,标准做法是右击,链接另存为...):
- #ifndef cimg_plugin_cimg4hdc
- #define cimg_plugin_cimg4hdc
- HBITMAP to_bmp(HDC dc) const
- {
- CImgDisplay disp;
- disp.width = width;
- disp.height = height;
- disp.normalization = 3;
- disp.is_closed = true;
- BITMAPINFO bmi;
- BITMAPINFOHEADER &bh = bmi.bmiHeader;
- bh.biSize = sizeof(BITMAPINFOHEADER);
- bh.biWidth = disp.width;
- bh.biHeight = -(int)disp.height;
- bh.biPlanes = 1;
- bh.biBitCount = 32;
- bh.biCompression = BI_RGB;
- bh.biSizeImage = 0;
- bh.biXPelsPerMeter = 1;
- bh.biYPelsPerMeter = 1;
- bh.biClrUsed = 0;
- bh.biClrImportant = 0;
- void *pvBits;
- HBITMAP bmp = CreateDIBSection(dc,
- &bmi,
- DIB_RGB_COLORS,
- &pvBits,
- NULL,0
- );
- if(bmp == NULL) return bmp;
- disp.bmi = bmi;
- disp.data = (unsigned int*)pvBits;
- disp.render(*this);
- disp.width = disp.height = 0;
- disp.data = NULL;
- return bmp;
- }
- CImg<T>& display(HDC dc, RECT &rc)
- {
- CImgDisplay disp;
- disp.width = rc.right - rc.left;
- disp.height = rc.bottom - rc.top;
- disp.normalization = 3;
- disp.is_closed = true;
- BITMAPINFOHEADER &bh = disp.bmi.bmiHeader;
- bh.biSize = sizeof(BITMAPINFOHEADER);
- bh.biWidth = disp.width;
- bh.biHeight = -(int)disp.height;
- bh.biPlanes = 1;
- bh.biBitCount = 32;
- bh.biCompression = BI_RGB;
- bh.biSizeImage = 0;
- bh.biXPelsPerMeter = 1;
- bh.biYPelsPerMeter = 1;
- bh.biClrUsed = 0;
- bh.biClrImportant = 0;
- disp.data = new unsigned int[disp.width*disp.height];
- disp.render(*this);
- ::SetDIBitsToDevice(dc,rc.left,rc.top,
- disp.width,disp.height,0,0,
- 0,disp.height,disp.data,&disp.bmi,DIB_RGB_COLORS);
- disp.width = disp.height = 0;
- delete []disp.data;
- return *this;
- }
- CImg(HBITMAP bmp)
- :width(0),height(0),depth(0),dim(0),is_shared(false),data(0)
- {
- load_bmp(bmp);
- }
- CImg<T>& assign(HBITMAP bmp)
- {
- return load_bmp(bmp);
- }
- CImg<T>& load_bmp(HBITMAP bmp)
- {
- BITMAP bmpobj;
- if(!::GetObject(bmp,sizeof(bmpobj),&bmpobj) || bmpobj.bmBitsPixel<16) return *this;
- LONG cbBuffer = bmpobj.bmWidthBytes*(bmpobj.bmHeight);
- BYTE *lvbit = new BYTE[cbBuffer];
- if(!::GetBitmapBits(bmp, cbBuffer, lvbit))
- {
- delete []lvbit;
- return *this;
- }
- unsigned char* ptrs = lvbit;
- int align = (4 - bmpobj.bmWidthBytes%4)%4;
- // Read pixel data
- assign(bmpobj.bmWidth,bmpobj.bmHeight,1,3);
- switch (bmpobj.bmBitsPixel) {
- case 16 : { // 16 bits colors
- for (int y=height-1; y>=0; --y) { cimg_forX(*this,x) {
- const unsigned char c1 = *(ptrs++), c2 = *(ptrs++);
- const unsigned short col = (unsigned short)(c1|(c2<<8));
- (*this)(x,y,2) = (T)(col&0x1F);
- (*this)(x,y,1) = (T)((col>>5)&0x1F);
- (*this)(x,y,0) = (T)((col>>10)&0x1F);
- } ptrs+=align; }
- } break;
- case 24 : { // 24 bits colors
- for (int y=height-1; y>=0; --y) { cimg_forX(*this,x) {
- (*this)(x,y,2) = (T)*(ptrs++);
- (*this)(x,y,1) = (T)*(ptrs++);
- (*this)(x,y,0) = (T)*(ptrs++);
- } ptrs+=align; }
- } break;
- case 32 : { // 32 bits colors
- for (int y=height-1; y>=0; --y) { cimg_forX(*this,x) {
- (*this)(x,y,2) = (T)*(ptrs++);
- (*this)(x,y,1) = (T)*(ptrs++);
- (*this)(x,y,0) = (T)*(ptrs++);
- ++ptrs;
- } ptrs+=align; }
- } break;
- }
- mirror('y');
- delete []lvbit;
- return *this;
- }
- #endif
测试代码(在WTL里测试):
- #define cimg_plugin "cimg4hdc.h"
- #include "CImg.h"
- using namespace cimg_library;
- CImg<unsigned char> m_show;
- // 生成部分
- {
- // 生成一个100*100的HBITMAP
- HDC dc = ::CreateCompatibleDC(0);
- HBITMAP bmp = ::CreateCompatibleBitmap(::GetDC(0), 100,100);
- ::SelectObject(dc, bmp);
- ::TextOut(dc, 10, 10, _T("Hello World"), 11);
- // 从HBITMAP生成一个CImg
- CImg<unsigned char> src(bmp);
- // 模糊计算,结果与原图并排送给m_show
- m_show = (src << src.get_blur(2)).get_append('x');
- // 删除HBITMAP和内存DC
- ::DeleteObject(bmp);
- ::DeleteDC(dc);
- }
- // 显示部分
- LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
- {
- CPaintDC dc(m_hWnd);
- RECT rc={
- 10,10,10+m_show.width,10+m_show.height
- };
- // 在HDC上显示m_show
- m_show.display(dc, rc);
- return 0;
- }
效果如下:
相关文章:

这可能是Python面向对象编程的最佳实践
作者 | 崔庆才来源 | 进击的Coder(ID:FightingCoder)Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了或者某一对象非常复杂了,其中的一些…

mysql之 CentOS系统针对mysql参数优化
内核相关参数(/etc/sysctl.conf) 以下参数可以直接放到sysctl.conf文件的末尾: net.core.somaxconn 65535 net.core.netdev_max_backlog 65535 net.ipv4.tcp_max_syn_backlog 65535 加快TCP连接的回收: net.i…

天猫双十一神话恐终结
2011年双十一大促,天猫商城创造了单日33.6亿的促销奇迹,是2010年同日交易额的近4倍。今年双十一即将来临,淘宝还能再创奇迹吗?何玺认为,淘宝双十一的神话恐终结,理由如下。 一、电商促销年消费被透支 年初 …

opencv图像旋转
转自:http://download.csdn.net/source/2642701 /* 程序名:rotate.c 功能:读入图像文件,做图像旋转转,然后显示图像在屏幕上 */ #include <stdlib.h> #include <stdio.h> #include <math.h> #inclu…

机器如何读懂人心:Keras实现Self-Attention文本分类
作者 | 小宋是呢转载自CSDN博客一、Self-Attention概念详解了解了模型大致原理,我们可以详细的看一下究竟Self-Attention结构是怎样的。其基本结构如下对于self-attention来讲,Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,首先我们要计…

通俗易懂!使用Excel和TF实现Transformer
作者 | 石晓文转载自小小挖掘机(ID:wAIsjwj)本文旨在通过最通俗易懂的过程来详解Transformer的每个步骤!假设我们在做一个从中文翻译到英文的过程,我们的词表很简单如下:中文词表:[机、器、学、习] 英文词表…

通过注册表修改VC6.0的字体【转】
2019独角兽企业重金招聘Python工程师标准>>> 在VC6.0下更改字体,我们一般通过菜单-Tools-Options-Format来更改 但在我的win7 64位系统下这一选项下的字体和字体颜色是空的,无法选择 所以我想起来通过注册表来更改。 WinR输入“Regedit”&…

Java中创建String的两种方式差异
我们知道创建一个String类型的变量一般有以下两种方法: String str1 "abcd"; String str2 new String("abcd"); 那么为什么会存在这两种创建方式呢,它们在内存中的表现形式各有什么区别? 方法1: String a …

OpenCV支持的图像格式
OpenCV目前支持的图像格式包括: Windows位图文件 - BMP, DIB; JPEG文件 - JPEG, JPG, JPE; 便携式网络图片 - PNG; 便携式图像格式 - PBM,PGM,PPM; Sun rasters - SR,RASÿ…

Debian Linux下的Python学习——控制流
python中有三种控制流语句:if、for和while。 1. if语句用法( if..elif..else) 代码: 运行: 注意:raw_input函数要求输入一个字符串,int把这个字符串转换为整数 2.for语句用法 (for ... else) 代码: 运行: 注:else部分是可选的。如果包含else,它总是在for循环结束后…

如何运行ImageMagick的命令行工具
在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static.exe为例说明。 将ImageMagick-6.6.5-10-Q16-windows-static.exe下载后,安装,然后将其中需要的命令行工具考到你需…

华为最强自研NPU问世,麒麟810“抛弃”寒武纪
整理 | 一一出品 | AI科技大本营(ID:rgznai100)“能效高、算子多、精度高”,华为消费者业务手机产品线总裁何刚用一句话总结了自研达芬奇架构给最新麒麟810芯片带来的变化。6 月 21 日,在 HUAWEI Nova 5 系列新品发布会上&#x…
调用 微信接口报错 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}...
如下截图,仅为备份,本文转载地址: http://www.cnblogs.com/liaolongjun/p/6080240.html 以下正文↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑…

javascript this用法小结
this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象。但是在javascript中,由于 javascript的动态性(解释执行,当然也有简单的预编译过程),this的指向在运…

在vc6控制台程序中如何调用运行ImageMagick命令行工具
在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static.exe为例说明。 将ImageMagick-6.6.5-10-Q16-windows-static.exe下载后,安装,然后将其中需要的命令行工具考到你程…

高频数据交换下Flutter与ReactNative的对比
后端使用go写的socketio服务模拟期货行情数据,每10ms推送10条行情数据 ReactNative已经尽力优化了。 Flutter由于没flutter-socketio这个库不支持dart2.0以上的版本,所有用了安卓的socketio,通过事件与Flutter通讯。 1.内存占用 ReactNative …

6月技术福利限时免费领
《程序员大本营》6月刊来啦~更多福利限时免费领取:CSDN重磅技术大会精选视频以及200PPT;机器学习、知识图谱、计算机视觉、区块链等100技术公开课及PPT全奉送...识别海报二维码,邀请3位好友扫码助力,即可免费领取↓↓↓❤提示&…

我对bgwriter.c 与 guc 关系的初步理解
我用例子来说明:只是一个模拟,我自己做的 假的 bgwriter.c [rootlocalhost test]# cat bgwriter.c #include<stdio.h> #include<stdlib.h> #include<signal.h> #include "bgwriter.h" #include "guc.h" //some co…

媲美Pandas?一文入门Python的Datatable操作
作者 | Parul Pandey译者 | linstancy责编 | Jane出品 | Python大本营(id:pythonnews)【导读】工具包 datatable 的功能特征与 Pandas 非常类似,但更侧重于速度以及对大数据的支持。此外,datatable 还致力于实现更好的…

java并发编程——并发容器类介绍
2019独角兽企业重金招聘Python工程师标准>>> 并发容器的简单介绍 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性&a…

CV_IMAGE_ELEM参数赋值时注意的问题
转自:http://hi.baidu.com/wangruiy01/blog/item/041ab03e8abd33c57d1e71a0.html CV_IMAGE_ELEM是一个宏, #define CV_IMAGE_ELEM( image, elemtype, row, col ) /(((elemtype*)((image)->imageData (image)->widthStep*(row)))[(col)])#define …

公司内部exchange2010 下删除误发邮件
1、Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E20102、get-mailbox | search-mailbox -SearchQuery 填写误发邮件标题 -TargetMailbox "administrator" -TargetFolder "SearchAndDeleteLog" -DeleteContent转载于:https://blog.51cto.com/wo…

从代码设计到应用开发,入坑深度学习看这本书就够了
深度学习(Deep Learning)是机器学习中一种基于对数据进行表征学习的方法。近年来,深度学习已经在科技界、工业界日益广泛地应用。随着全球各领域多样化数据的极速积累和计算资源的成熟化商业服务,深度学习已经成为人工智能领域最有…

小波矩特征提取matlab代码
这是我上研究生时写的小波矩特征提取代码: %新归一化方法小波矩特征提取---------------------------------------------------------- Fimread(a1.bmp);Fim2bw(F);Fimresize(F,[128 128]);%求取最上点for i1:128 for j1:128 if (F(i,j)1) yt…

hadoop生态搭建(3节点)-06.hbase配置
# http://archive.apache.org/dist/hbase/1.2.4/ # 安装 hbase tar -zxvf ~/hbase-1.2.4-bin.tar.gz -C /usr/local rm –r ~/hbase-1.2.4-bin.tar.gz # 配置环境变量# node1 node2 node3 vi /etc/profile# 在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL下添…

异类框架BigDL,TensorFlow的潜在杀器!
作者 | Nandita Dwivedi译者 | 风车云马责编 | Jane出品 | AI 科技大本营(id:rgznai100)【导读】你能利用现有的 Spark 集群构建深度学习模型吗?如何分析存储在 HDFS、Hive 和 HBase 中 tb 级的数据吗?企业想用深度学习…

对IsUnderPostmaster变量初步学习
开始 在postmaster.c 中的 BackendStartup 中,有如下的代码: 其中定义了 IsUnderPostmastertrue。 而bgwriter 作为 postmaster 的子进程,它的 IsUnderPostmaster 也是为真。 * BackendStartup -- start backend process** returns: STATUS_…

C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
转自:http://hi.baidu.com/andywangcn/blog/item/10ba730f48160eeb37d122e9.html 配置文件中经常用到ini文件,在VC中其函数分别为: #include <Windows.h> //wince,WMobile.ppc不支持这几个函数 写入.ini文件:bool WritePriv…

地图下载2之天超图瓦片格式
接上一篇《地图下载1之天地图瓦片解析》,我们已经知道了天地图的瓦片格式,现在来分析一下超图中瓦片的存储结构。 其实,在GIS领域,只有像ESRI这样强大公司的SHP文件等能通用外,很多数据、格式等都不通用,都…

server 2003登录界面黑屏的解决办法
1、备份注册表(为了安全起见)具体办法:开始-> 运行窗口输入“regedit.exe”->回车->找到注册表->文件->导出->完成; 2、复制下面的文件内容到记事本然后另存为格式为.reg注册表扩展名导入注册表; Wi…