截图方式和以前一样, 用GetDC, 保存为JPG的方式改用IWICImage接口, 在我机器上 1920*1080 大概花费70毫秒左右, 比用TJPEGImage快了一倍多(TJPEGImage需要160毫秒左右)

直接上代码

  1. uses
  2. Winapi.ActiveX, Winapi.Wincodec;
  3.  
  4. {$R *.dfm}
  5.  
  6. {将TWICImage CreateWicBitmapSaveToStream摘出来}
  7. procedure _SaveToStream(ABMP: TBitmap; Stream: TMemoryStream);
  8. var
  9. nPixelFormat: TGUID;
  10. nBitmapInfo: TBitmapInfo;
  11. nBuffer: array of byte;
  12. nHBMP: HBITMAP;
  13.  
  14. nEncoder: IWICBitmapEncoder;
  15. nFrame: IWICBitmapFrameEncode;
  16. nProps: IPropertyBag2;
  17. nLStreamAdapter: IStream;
  18. nLStream: IWICStream;
  19. nPalette: IWICPalette;
  20. nWicBitmap: IWICBitmap;
  21.  
  22. nWidth, nHeight: Integer;
  23. nWICFactory: IWICImagingFactory;
  24. begin
  25. CoCreateInstance(CLSID_WICImagingFactory, nil, CLSCTX_INPROC_SERVER or
  26. CLSCTX_LOCAL_SERVER, IUnknown, nWICFactory);
  27.  
  28. nPixelFormat := GUID_WICPixelFormat24bppBGR;
  29. nWidth := ABMP.Width;
  30. nHeight := ABMP.Height;
  31.  
  32. ABMP.PixelFormat := pf24bit;
  33.  
  34. SetLength(nBuffer, nWidth * * nHeight);
  35.  
  36. FillChar(nBitmapInfo, sizeof(nBitmapInfo), );
  37. nBitmapInfo.bmiHeader.biSize := SizeOf(nBitmapInfo);
  38. nBitmapInfo.bmiHeader.biWidth := nWidth;
  39. nBitmapInfo.bmiHeader.biHeight := -nHeight;
  40. nBitmapInfo.bmiHeader.biPlanes := ;
  41. nBitmapInfo.bmiHeader.biBitCount := ;
  42. // Forces evaluation of Bitmap.Handle before Bitmap.Canvas.Handle
  43. nHBMP := ABMP.Handle;
  44. GetDIBits(ABMP.Canvas.Handle, nHBMP, , nHeight, @nBuffer[],
  45. nBitmapInfo, DIB_RGB_COLORS);
  46. nWicBitmap := nil;
  47. nWICFactory.CreateBitmapFromMemory(nWidth, nHeight, nPixelFormat,
  48. nWidth * , Length(nBuffer), @nBuffer[], nWicBitmap);
  49.  
  50. Stream.Clear;
  51. nLStreamAdapter := TStreamAdapter.Create(Stream);
  52.  
  53. nWICFactory.CreateStream(nLStream);
  54. nLStream.InitializeFromIStream(nLStreamAdapter);
  55. nWICFactory.CreateEncoder(GUID_ContainerFormatJpeg, guid_null, nEncoder);
  56.  
  57. nEncoder.Initialize(nLStream, WICBitmapEncoderNoCache);
  58. nEncoder.CreateNewFrame(nFrame, nProps);
  59.  
  60. nFrame.Initialize(nProps);
  61. nWicBitmap.GetPixelFormat(nPixelFormat);
  62. nFrame.SetPixelFormat(nPixelFormat);
  63.  
  64. nFrame.SetSize(nWidth, nHeight);
  65.  
  66. nWICFactory.CreatePalette(nPalette);
  67. nWicBitmap.CopyPalette(nPalette);
  68. nFrame.SetPalette(nPalette);
  69. nFrame.WriteSource(nWicBitmap, nil);
  70. nFrame.Commit;
  71. nEncoder.Commit;
  72.  
  73. Stream.Position := ;
  74. end;
  75.  
  76. procedure TForm1.Button1Click(Sender: TObject);
  77. var
  78. nHDC: HDC;
  79. nBmp: TBitmap;
  80. nMS: TMemoryStream;
  81. nWic: TWICImage;
  82. begin
  83. nMS := TMemoryStream.Create;
  84. nBmp := TBitmap.Create;
  85. try
  86. nHDC := GetDC();
  87. nMS.Clear;
  88. nBmp.PixelFormat := pf24bit;
  89. nBmp.Width := Screen.Width;
  90. nBmp.Height := Screen.Height;
  91. {这里大概花费60毫秒, 应该可以再快}
  92. BitBlt(nBmp.Canvas.Handle, , , nBmp.Width, nBmp.Height, nHDC, , , cmSrcCopy);
  93. ReleaseDC(, nHDC);
  94. _SaveToStream(nBmp, nMS);
  95.  
  96. {查看截图内容, 10毫秒左右, 不计入截图时间}
  97. nWic := TWICImage.Create;
  98. nWic.ImageFormat := wifJpeg;
  99. nWic.LoadFromStream(nMS);
  100. Image1.Picture.Assign(nWic);
  101. nWic.Free;
  102. finally
  103. nBmp.Free;
  104. nMS.Free;
  105. end;
  106. 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. php正则匹配utf-8编码的中文汉字

    在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { a ...

  2. 将网页封装成苹果APP的牛逼方法,无需发布到appstore,无需越狱即可安装

    很多小伙伴都在开发自己的app, 有的实现实现比较简单,就是一个h5页面,然后想要打包成app发布出去. 这个想法很单纯 打包生成个app这个是很简单的,网上一堆打包工具,分分钟可以完成 但是... ...

  3. WPF加载程序集中字符串资源

    WPF资源 WPF资源使用其实的也是resources格式嵌入资源,默认的资源名称为"应用程序名.g.resources",不过WPF资源使用的pack URI来访问资源. 添加图 ...

  4. 【NOIP2012】提高组初赛试题(个人错题解析+相关知识点扩展)C++版

    初赛14号就要开始了,从今天到14号还有三天,已经请了两节的自习来刷题,每天三四套题,尽量把01年到16年的题目全刷一遍.[fighting!!!] 4.无论是TCP/IP模型还是OSI模型,都可以视 ...

  5. 全面解读JavaScript入门到进阶,100%基础知识掌握!

    一.JavaScript 简介 1.JavaScript 是 Web 的编程语言,是前端开发必须掌握的三门语言之一,即: HTML   定义了网页的内容 CSS      描述了网页的布局 JavaS ...

  6. IOS系统配置FFMEPG

    在FFMPEG的官网上可以找到标准的配置文档...http://ffmpeg.org/trac/ffmpeg/wiki/MacOSXCompilationGuide 在开始前确保安装了XCODE而且也 ...

  7. 【特效】体验很好的导航hover效果移出恢复当前位置

    很常见的一种导航的hover效果,鼠标放上后除了正常的hover,在移出整个导航后,会恢复当前栏目的特殊样式,分别有横向和纵向的导航.代码也比较简单,设置一个当前栏目的class,用index()找到 ...

  8. Html 初识样式表&选择器

    样式表&类选择器分类 样式表分类: 1.内联式样式表:在标签内部写样式代码,精确但不方便,增加工作量,后期修改麻烦. 2.嵌入式样式表:一般写在head内 以<style>.... ...

  9. exp3.1实现顺序栈的各种操作

    #include<iostream>using namespace std;#include<malloc.h>typedef char Elem;typedef struct ...

  10. 接口自动化测试方案PHP + mysql

    接口测试在测试工作中是很常见的工作,但是在以往的接口测试工作中借助的一般是第三方插件.python开发的发送请求脚本.LR脚本.Jmeter脚本,之前也使用python开发了一套接口自动化测试系统,但 ...