截图方式和以前一样, 用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的截图代码的更多相关文章

  1. 基于PYQT5的截图翻译工具

    基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...

  2. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯

    20个最强的基于浏览器的在线代码编辑器 - OPEN资讯 20个最强的基于浏览器的在线代码编辑器

  3. 基于git命令的代码统计方法

    基于git命令的代码统计方法 没什么好说的,基于git log命令,使用前提是安装了git ...... .统计所有人代码量 统计所有人代码增删量,拷贝如下命令,直接在git bash等终端,git项 ...

  4. 机器学习--PCA算法代码实现(基于Sklearn的PCA代码实现)

    一.基于Sklearn的PCA代码实现 import numpy as np import matplotlib.pyplot as plt from sklearn import datasets ...

  5. mac默认截图、截图代码

    苹果系统自带截图功能   1 截取全屏:快捷键(Shift+Command+3) 直接按“Shift+Command+3“快捷键组合,即可截取电脑全屏,图片自动保存在桌面. 2 截图窗口:快捷键(Sh ...

  6. 【Django】基于Django架构网站代码的目录结构

     经典的Django项目源码目录结构 Django在一个项目的目录结构划分方面缺乏必要的规范.在Django的官方文档中并没有给出大型项目的代码建议目录结构,网上的文章也是根据项目的不同结构也有适当的 ...

  7. 基于ProGuard-Maven-Plugin的自定义代码混淆插件

    介绍 大家可能都会碰到一些代码比较敏感的项目场景,这个时候代码被反编译看到就不好了,这个时候就需要代码混淆插件来对代码进行混淆了. 基于Maven的项目一般会去考虑使用proguard-maven-p ...

  8. 基于Office 365 无代码工作流分析-需求基本分析!

     客户需求分析: 嘉昊信息是一家IT创业型公司,因为公司初创,有较多的招聘员工的需求,公司近期购买了Office 365,因为招聘工作繁琐,HR人员须要做非常多反复繁琐工作,HR主管提议开发一个招 ...

  9. 在win7上跑基于任少卿作者代码修改的RPN+BF实验

    1.前言 之前在win10上成功的跑起来faster-rcnn的实验,并且跑了一下CaltechPedestrian的数据集,但是效果一直不理想,折腾了好久也没弄清楚到底原因出在哪里,直到读了Is F ...

随机推荐

  1. 关于JQuery全选/反选第二次失效的问题

    最近在项目中,遇到一个问题,测试全选/反选功能时,第一次对母框进行选中/非选中时,能同步子框的全选/反选状态,之后再点击母框,子框就没反应了.原代码大致结构关键如下: function selectA ...

  2. clone github报Permission denied (publickey) 解决方案

    问题描述 问题产生的原因,不是很清楚,就不管了.在执行git clone git@github.com:****.git 的时候报了Permission denied (publickey). War ...

  3. ZOJ2345Gold Coins 简单分块

    昨天做过一样的题: 平方和公式:n*(n+1)*(2n+1) #include<cstdio> #include<cstdlib> #include<iostream&g ...

  4. JSONP、图片Ping、XMLHttpRequest2.0等跨域资源请求(CORS)

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  5. iOS音频播放、录音、视频播放、拍照、视频录制

    随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操 ...

  6. 微信小程序- 生成二维码

    wx.request({ // 获取token url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential', ...

  7. win10 uwp 如何让一个集合按照需要的顺序进行排序

    虽然这是 C# 的技术,但是我是用在 uwp ,于是就把标题写这个名.有一天,我的小伙伴让我优化一个列表.这个列表是 ListView 他绑定了一个 ObservableCollection 所以需要 ...

  8. Mysql 用户,权限管理的几点理解。

    前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...

  9. vb.net 代码建立控件,并显示在窗体上

    Dim lb As New Label        lb.Text = "hello"        lb.Top = 200        lb.Left = 100      ...

  10. swift之函数式编程(三)

    文章来源于<Functional Programing in Swift>,本系列仅仅是观后概括的一些内容 Wrapping Core Image 上一篇文章我们介绍了 高阶函数并且展示了 ...