基于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 ...
随机推荐
- Linux下Apache https认证
参考:http://kyfxbl.iteye.com/blog/1910891 http://showerlee.blog.51cto.com/2047005/1266712 一.环境 httpd:A ...
- 简单Elixir游戏服设计-创建玩家模型
删除model.ex 创建玩家模型 player.ex, 简单化,只有唯一标识,昵称,金币,够用了. 选择 map 代表数据,是为了扩展数据结构,方便增加功能.struct也是可以的. add_num ...
- eclipse的插件开发-启动时间
今天晚上看<深入理解java虚拟机>时,作者在书中有一段,eclipse优化的章节,其中涉及到了eclipse启动时间检测的插件开发 于是翻了翻资料,也开发了一个自己的插件 如图是开发后启 ...
- 使用VLC创建组播流
vlc既是一个播放器,又可以成为一个流媒体服务器.最近需要做udp组播播放相关的东西,需要先在本地搭建一个udp组播服务器,因为机器上本来就装有vlc,所以就用它了. 第一步: 点击媒体->流 ...
- ubuntu系统如何屏幕截图
我们知道,windows下有很多截图的软件和插件,那么在ubuntu系统下我们该怎样截图呢? 下面就让小编来告诉你几种简单的方法吧. 工具/原料 ubuntu系统电脑 方法一: 1.也许很多朋友都知道 ...
- c#枚举 获取枚举键值对、描述等
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.C ...
- JQuery上传插件Uploadify详解及其中文按钮解决方案 .
Uploadify有一个参数是 buttonText 这个无论你怎么改都不支持中文,因为插件在js里用了一个转码方法把这个参数的值转过码了,解码的地方在那个swf文件里,看不到代码,所以这条路不行. ...
- python apschedule安装使用与源码分析
我们的项目中用apschedule作为核心定时调度模块.所以对apschedule进行了一些调查和源码级的分析. 1.为什么选择apschedule? 听信了一句话,apschedule之于pytho ...
- 吾八哥学Python(三):了解Python基础语法(上)
学习一门开发语言首先当然是要熟悉它的语法了,Python的语法还算是比较简单的,这里从基础的开始了解一下. 标识符1.第一个字符必须是字母表中字母或下划线'_'.2.标识符的其他的部分有字母.数字和下 ...
- Windows环境部署并调试pyspark(一)
准备: windows环境说明:Python2.7 + pipspark版本:spark-1.6.1-bin-hadoop2.6 step1: 下载并解压tar包到自定义的路径.(下载链接 https ...