前言
C#实现同屏的时候,频繁截屏内存并不能很好的释放,所以就打算用C++实现这部分的功能。
这里图片的压缩用到了JpegLib, JpegLib是一个用C编写的jpeg图像压缩免费库,许多应用程序对jepg的支持都依赖于该库。
编译库
下载
下载地址:https://www.ijg.org/
官方下载地址:jpegsr9d.zip
百度云链接:https://pan.baidu.com/s/13xhEjxWR9b6Bx7OL6tLTIw
提取码:6owy
编译
使用Vistual studio的命令行工具进入源码文件夹
如图
注意
不要用系统的CMD或者Powershell,无法编译。
源码中复制一份jconfig.vc
,改变后缀变为jconfig.h
执行如下命令
1 | nmake -f makefile.vc |
提示找不到win32.mak文件,在C盘搜索这个文件名,没有发现该文件,可以直接下一个
链接:https://pan.baidu.com/s/1y-uAsb5e6KdWFRgY3MxaKg
提取码:kn30
把·win32.mak
放在源码目录下即可(Win10环境下需要下载)
编译成功后再项目下创建libjpeg
文件夹,里面再创建include
和lib
把编辑后的libjpeg.lib
放在lib
目录下,所有的.h
的头文件放在include
下
处理好的文件如下
链接:https://pan.baidu.com/s/1vEjL6CHgFDuqQioLq3dhJw
提取码:qeb3
项目引用
创建C++控制台项目
打开项目所在目录,在项目下创建modules
文件夹,把之前的libjpeg
文件夹放进来
项目右键属性
一定要注意,这里要和运行的环境一致。
在C/C++
下常规
中的附加包含目录
中添加modules\libjpeg\include
链接器
=>常规
=>附加库目录
中添加modules\libjpeg\lib
链接器
=>输入
=>附加依赖项
中添加libjpeg.lib
这样项目中就可以调用了
代码
截屏
ScreenShot.h
1 |
|
ScreenShot.cpp
1 |
|
BMP转JPEG
Bmp2Jpeg.h
1 |
|
Bmp2Jpeg.cpp
1 |
|
这里是类,为了方便导出,我们添加以下方法,为了方便后续的导出。
MyBmp2Jpeg.h
1 |
|
MyBmp2Jpeg.cpp
1 |
|
测试
main.cpp
1 |
|
或者
1 |
|
暴漏DLL方法
特别注意
生成DLL一定要用Release环境!!!
生成DLL一定要用Release环境!!!
生成DLL一定要用Release环境!!!
否则会依赖的DLL也会用Debug的DLL,在普通用户的环境中是没有这些DLL的。
(1) 修改原项目的配置类型为动态库(.dll)
(2) 项目中添加模块定义文件
screenshot.def
1 | LIBRARY screenshot |
右键项目,点击重新生成
,这时候就会生成DLL文件。
注意
文件名和
LIBRARY screenshot
都要和项目名保持一致导出都要导出方法,不要导出类,导出类其他语言不支持,所以我们添加一个导出方法MyBmp2Jpeg
查看导出的DLL
在VS目录中搜索dumpbin.exe
,添加到环境变量中
1 | dumpbin /exports screenshot.dll |
可以看到导出的方法
测试导出DLL
在原解决方案中添加新项目screenshot_test
,并把新项目设置为启动项目。
screenshot_test.cpp
1 |
|
DLL导出类:
优点:导出的类可以被继承,调用层次也清晰,可以保留类的完整特性;
缺点:不能被其它语言调用(包括C语言),封装性并不是太好。
导出函数:
优点:可以被其它语言调用,使用简单,封装性相对较好;
缺点:调用层次不明显,尤其是在导出函数多的情况下,比较混乱,不能出现同名导出函数。
运行库
https://www.microsoft.com/zh-CN/download/details.aspx?id=48145
https://www.microsoft.com/zh-cn/download/details.aspx?id=26999
C#调用DLL方法
项目文件夹下创建DLLCPP文件夹,把screenshot.dll
放进来
属性
=>生成事件
=>生成前事件命令行
中添加
1 | xcopy /Y /i /e $(ProjectDir)\DLLCPP $(TargetDir)\ |
页面中调用
1 | [ ] |
调用方式
1 | ScreenShot("D:\\pic\\2.bmp"); |