截图方式和以前一样, 用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. 为什么说程序员都应该玩一玩GitHub

    既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...

  2. C# 7 局部函数剖析

    局部函数是C# 7中的一个新功能,允许在一个函数中定义另一个函数. 何时使用局部函数? 局部函数的主要功能与匿名方法非常相似:在某些情况下,创建一个命名函数在读者的认知负担方面代价太大.有时,函数本身 ...

  3. HDU1142 A Walk Through the Forest(最短路+DAG)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...

  4. ZOJ2286 Sum of Divisors 筛选式打表

    我想我是和Segmentation Fault有仇,我一直以为是空间开大的问题,然后一直减少空间,还是SF,谁让n没有给范围了,qwq. 教训:以后注意输入范围和开的空间大小. #include< ...

  5. ConvertUtils.register注册转换器

    当用到BeanUtils的populate.copyProperties方法或者getProperty,setProperty方法其实都会调用convert进行转换 但Converter只支持一些基本 ...

  6. netconf选用秘钥登录

    #! /usr/bin/python2.7import ncclientfrom ncclient import managerwith manager.connect(\ host="19 ...

  7. win10 uwp 俄罗斯方块

    俄罗斯方块是一个很经典的游戏,做一个UWP俄罗斯方块没有什么用,我想说的是移植,把经典游戏移植到UWP. 我的所有博客都是抄别人的,这个才是我自己写的.后台很多代码还是抄别人的,我想说的是我们之前有很 ...

  8. Web安全学习笔记(一)

    Web安全学习笔记(一): URL协议 HTTP协议 1. URL 2. HTTP协议 什么是HTTP HTTP的工作原理 HTTP报文 什么是Cookies HTTP请求方式 Referer请求的功 ...

  9. 浅谈 var 关键字

    提起 var关键子,程序员的第一反应就是JavaScript, 事实上这个关键子在其他语言中也有被采用. 比如说C#, 比如说kotlin, 用法和JavaScript中使用差不多,作为要声明变量的前 ...

  10. angular1与swiper

    angular1路由切换过程中swiper不能使用. 问题1:在刚开始使用angular1的路由时,好多人会将swiper的初始化写在模板的父控制器上,这样会造成一个问题,swiper的初始化只在页面 ...