基于IWICImage的截图代码
截图方式和以前一样, 用GetDC, 保存为JPG的方式改用IWICImage接口, 在我机器上 1920*1080 大概花费70毫秒左右, 比用TJPEGImage快了一倍多(TJPEGImage需要160毫秒左右)
直接上代码
uses
Winapi.ActiveX, Winapi.Wincodec; {$R *.dfm} {将TWICImage的 CreateWicBitmap和SaveToStream摘出来}
procedure _SaveToStream(ABMP: TBitmap; Stream: TMemoryStream);
var
nPixelFormat: TGUID;
nBitmapInfo: TBitmapInfo;
nBuffer: array of byte;
nHBMP: HBITMAP; nEncoder: IWICBitmapEncoder;
nFrame: IWICBitmapFrameEncode;
nProps: IPropertyBag2;
nLStreamAdapter: IStream;
nLStream: IWICStream;
nPalette: IWICPalette;
nWicBitmap: IWICBitmap; nWidth, nHeight: Integer;
nWICFactory: IWICImagingFactory;
begin
CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, nWICFactory); nPixelFormat := GUID_WICPixelFormat24bppBGR;
nWidth := ABMP.Width;
nHeight := ABMP.Height; ABMP.PixelFormat := pf24bit; SetLength(nBuffer, nWidth * * nHeight); FillChar(nBitmapInfo, sizeof(nBitmapInfo), );
nBitmapInfo.bmiHeader.biSize := SizeOf(nBitmapInfo);
nBitmapInfo.bmiHeader.biWidth := nWidth;
nBitmapInfo.bmiHeader.biHeight := -nHeight;
nBitmapInfo.bmiHeader.biPlanes := ;
nBitmapInfo.bmiHeader.biBitCount := ;
// Forces evaluation of Bitmap.Handle before Bitmap.Canvas.Handle
nHBMP := ABMP.Handle;
GetDIBits(ABMP.Canvas.Handle, nHBMP, , nHeight, @nBuffer[],
nBitmapInfo, DIB_RGB_COLORS);
nWicBitmap := nil;
nWICFactory.CreateBitmapFromMemory(nWidth, nHeight, nPixelFormat,
nWidth * , Length(nBuffer), @nBuffer[], nWicBitmap); Stream.Clear;
nLStreamAdapter := TStreamAdapter.Create(Stream); nWICFactory.CreateStream(nLStream);
nLStream.InitializeFromIStream(nLStreamAdapter);
nWICFactory.CreateEncoder(GUID_ContainerFormatJpeg, guid_null, nEncoder); nEncoder.Initialize(nLStream, WICBitmapEncoderNoCache);
nEncoder.CreateNewFrame(nFrame, nProps); nFrame.Initialize(nProps);
nWicBitmap.GetPixelFormat(nPixelFormat);
nFrame.SetPixelFormat(nPixelFormat); nFrame.SetSize(nWidth, nHeight); nWICFactory.CreatePalette(nPalette);
nWicBitmap.CopyPalette(nPalette);
nFrame.SetPalette(nPalette);
nFrame.WriteSource(nWicBitmap, nil);
nFrame.Commit;
nEncoder.Commit; Stream.Position := ;
end; procedure TForm1.Button1Click(Sender: TObject);
var
nHDC: HDC;
nBmp: TBitmap;
nMS: TMemoryStream;
nWic: TWICImage;
begin
nMS := TMemoryStream.Create;
nBmp := TBitmap.Create;
try
nHDC := GetDC();
nMS.Clear;
nBmp.PixelFormat := pf24bit;
nBmp.Width := Screen.Width;
nBmp.Height := Screen.Height;
{这里大概花费60毫秒, 应该可以再快}
BitBlt(nBmp.Canvas.Handle, , , nBmp.Width, nBmp.Height, nHDC, , , cmSrcCopy);
ReleaseDC(, nHDC);
_SaveToStream(nBmp, nMS); {查看截图内容, 10毫秒左右, 不计入截图时间}
nWic := TWICImage.Create;
nWic.ImageFormat := wifJpeg;
nWic.LoadFromStream(nMS);
Image1.Picture.Assign(nWic);
nWic.Free;
finally
nBmp.Free;
nMS.Free;
end;
end;
基于IWICImage的截图代码的更多相关文章
- 基于PYQT5的截图翻译工具
基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...
- 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯
20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器
- 基于git命令的代码统计方法
基于git命令的代码统计方法 没什么好说的,基于git log命令,使用前提是安装了git ...... .统计所有人代码量 统计所有人代码增删量,拷贝如下命令,直接在git bash等终端,git项 ...
- 机器学习--PCA算法代码实现(基于Sklearn的PCA代码实现)
一.基于Sklearn的PCA代码实现 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets ...
- mac默认截图、截图代码
苹果系统自带截图功能 1 截取全屏:快捷键(Shift+Command+3) 直接按“Shift+Command+3“快捷键组合,即可截取电脑全屏,图片自动保存在桌面. 2 截图窗口:快捷键(Sh ...
- 【Django】基于Django架构网站代码的目录结构
经典的Django项目源码目录结构 Django在一个项目的目录结构划分方面缺乏必要的规范.在Django的官方文档中并没有给出大型项目的代码建议目录结构,网上的文章也是根据项目的不同结构也有适当的 ...
- 基于ProGuard-Maven-Plugin的自定义代码混淆插件
介绍 大家可能都会碰到一些代码比较敏感的项目场景,这个时候代码被反编译看到就不好了,这个时候就需要代码混淆插件来对代码进行混淆了. 基于Maven的项目一般会去考虑使用proguard-maven-p ...
- 基于Office 365 无代码工作流分析-需求基本分析!
客户需求分析: 嘉昊信息是一家IT创业型公司,因为公司初创,有较多的招聘员工的需求,公司近期购买了Office 365,因为招聘工作繁琐,HR人员须要做非常多反复繁琐工作,HR主管提议开发一个招 ...
- 在win7上跑基于任少卿作者代码修改的RPN+BF实验
1.前言 之前在win10上成功的跑起来faster-rcnn的实验,并且跑了一下CaltechPedestrian的数据集,但是效果一直不理想,折腾了好久也没弄清楚到底原因出在哪里,直到读了Is F ...
随机推荐
- [转载]Reids配置文件详解
# redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...
- mysql慢查询分析工具 mysqlsla 安装
概述 mysqlsla 是一款很不错的mysql慢查询日志分析工具,而且简单易用.mysqlsla 是用perl编写的脚本,运行需要perl-DBI和per-DBD-Mysql两模块的支持.mysql ...
- 在项目中创建单元测试时junit的配置和使用
首先配置项目中AndroidMainfest.xml文件,加入 <instrumentation android:name="android.test.InstrumentationT ...
- 在sqlserver2005/2008中备份数据库,收缩日志文件
---1.先备份数据库(含日志文件) use myhis go backup database myhis to disk='d:\myhis_rzbak' go ---2.设为简单恢复模式 use ...
- 在SQL中用正则表达式替换html标签(2)
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...
- 从实践的角度理解cookie的几个属性
cookie的处理流程大致分为以下几步: 1.浏览器初次请求服务器. 2.服务器认为有必要设置cookie,通过响应报文首部:Set-Cookie告知浏览器,cookie的内容. 3.浏览器本地保存( ...
- [#1] YCbCr与RGB的转换公式
1 YCbCr简介 YCbCr颜色空间是将RGB颜色空间进行坐标转换后得到的,常用于数字电视系统.Y取值范围:16~235 Cb.Cr的取值范围:16~240 YCbCr经常和YUV混淆.两者的主要差 ...
- topN 算法 以及 逆算法(随笔)
topN 算法 以及 逆算法(随笔) 注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据. 这就是所谓的 topN 算法.当然你可以说我就 sort 一下 排序完了直 ...
- C# TextBlock 上标
我需要做一个函数,显示 ,但是看起来用 TextBlock 做的不好看. 我用 WPF 写的上标看起来不好看,但是最后有了一个简单方法让他好看. 本文告诉大家如何做一个好看的上标. 一开始做的方法: ...
- 案例:AWR手工创建快照失败,SYSAUX表空间剩余不足处理
案例:AWR手工创建快照失败,SYSAUX表空间剩余不足处理 版本:Oracle 11.2.0.4 RAC 问题现象:AWR手工创建快照失败,SYSAUX表空间剩余不足. 1. 查看SYSAUX表空间 ...