最近用到 PC远程监控,用GDI+屏幕截图内存BMP转JPG,压缩 ,JPG再转IStream流,IStream流再转BYTE,通过SOCKET 转发;

/****************BMP转JPG*********用法示例**************************Bitmap newbitmap(L"d:\\d.bmp");//加载BMP
const unsigned short *pFileName=L"d:\\new.jpg";//保存路径
SaveFile(&newbitmap,pFileName );************************************************************/void SaveFile(Bitmap* pImage, const wchar_t* pFileName)//
{EncoderParameters encoderParameters;CLSID jpgClsid; GetEncoderClsid(L"image/jpeg", &jpgClsid);encoderParameters.Count = 1;encoderParameters.Parameter[0].Guid = EncoderQuality;encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;encoderParameters.Parameter[0].NumberOfValues = 1;// Save the image as a JPEG with quality level 100.ULONG             quality;quality = 100;encoderParameters.Parameter[0].Value = &quality;Status status = pImage->Save(pFileName, &jpgClsid, &encoderParameters);if (status != Ok) {wprintf(L"%d Attempt to save %s failed.\n", status, pFileName);}
}
/****************BMP转JPG 压缩 转字节流*********用法示例**************************// 将当前屏幕保存成为jpg图片
// 参数   xs = 图象x轴大小 (压缩后)  ys = 图象y轴大小(压缩后) ,   quality = jpeg图象质量  ************************************************************/void SaveCurScreenJpg(LPCWSTR   pszFileName,   int   xs,   int   ys,   int   quality)
{   HWND hwnd = ::GetDesktopWindow();   HDC hdc = GetWindowDC(NULL);   int x = GetDeviceCaps(hdc, HORZRES);   int y = GetDeviceCaps(hdc, VERTRES);   HBITMAP hbmp = ::CreateCompatibleBitmap(hdc, x, y), hold;   HDC hmemdc = ::CreateCompatibleDC(hdc);   hold = (HBITMAP)::SelectObject(hmemdc,   hbmp);   BitBlt(hmemdc, 0, 0, x, y, hdc, 0, 0, SRCCOPY);   SelectObject(hmemdc, hold);   Bitmap bit(xs, ys), bit2(hbmp, NULL);   Graphics g(&bit);   g.ScaleTransform((float)xs/x,   (float)ys/y);   g.DrawImage(&bit2,   0,   0);   CLSID                           encoderClsid;   EncoderParameters   encoderParameters;   encoderParameters.Count   =   1;   encoderParameters.Parameter[0].Guid   =   EncoderQuality;   encoderParameters.Parameter[0].Type   =   EncoderParameterValueTypeLong;   encoderParameters.Parameter[0].NumberOfValues   =   1;   encoderParameters.Parameter[0].Value   =   &quality;   GetEncoderClsid(L"image/jpeg",   &encoderClsid);   bit.Save(pszFileName,   &encoderClsid,   &encoderParameters);   IStream *stream = NULL;if( ::CreateStreamOnHGlobal( NULL, TRUE, &stream ) != S_OK ){return  ;}/* save the image to stream */VOID * outbuf = NULL;size_t nDatalen =0;/* read the stream to buffer */if( !stream_to_mem( stream, &outbuf, &nDatalen  ) ){stream->Release();//return  ;}stream->Release();///可以把数据流通过 线程 socket  发送出去;free(outbuf);::DeleteObject(hbmp);   ::DeleteObject(hmemdc);   return;
}  /****************stream_to_mem **************************Stream to byte
************************************************************/
static bool stream_to_mem( IStream *stream, void **outbuf, size_t *size )
{ULARGE_INTEGER ulnSize;LARGE_INTEGER lnOffset;lnOffset.QuadPart = 0;/* get the stream size */if( stream->Seek( lnOffset, STREAM_SEEK_END, &ulnSize ) != S_OK ){return false;}if( stream->Seek( lnOffset, STREAM_SEEK_SET, NULL ) != S_OK ){return false;}/* read it */*outbuf = malloc( (size_t)ulnSize.QuadPart );*size = (size_t) ulnSize.QuadPart;ULONG bytesRead;if( stream->Read( *outbuf, (ULONG)ulnSize.QuadPart, &bytesRead ) != S_OK ){free( *outbuf );return false;}return true;
}同时还用到了一个函数
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{   UINT num = 0;                     // number of image encoders   UINT size = 0;                   // size of the image encoder array in bytes   ImageCodecInfo* pImageCodecInfo = NULL;   GetImageEncodersSize(&num, &size);   if(size == 0)   return -1;     //   Failure   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));   if(pImageCodecInfo == NULL)   return -1;     //   Failure   GetImageEncoders(num, size, pImageCodecInfo);   for(UINT j = 0; j < num; ++j)   {   if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )   {   *pClsid = pImageCodecInfo[j].Clsid;   free(pImageCodecInfo);   return j;     //   Success   }           }   free(pImageCodecInfo);   return -1;     //   Failure
}demo 

VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE相关推荐

  1. Windows GDI 窗口与 Direct3D 屏幕截图

    前言 Windows 上,屏幕截图一般是调用 win32 api 完成的,如果 C# 想实现截图功能,就需要封装相关 api.在 Windows 上,主要图形接口有 GDI 和 DirectX.GDI ...

  2. VC GDI+: error C2660: 'new' : function does not take 3 parameters

    今天在用GDI+写程序时,有 bmp = new Bitmap(L"E:\\1.png"); 用VC6 SP6或VS2005编译错误为error C2660: 'new' : fu ...

  3. 窗口截图(可指定HWND窗口句柄)

    方法一 BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) {HWND hDesktop = ::GetDesktopWindow();ASSERT ...

  4. VC启动窗口画面制作方法研究

    VC启动窗口画面制作方法研究 源代码运行效果图如下: 1. 概述 前几天在设计软件时,选择VC作为开发工具,想做个启动画面,由于以前没有制作过,所以到网上搜了一通.网上有几篇相关文章,有两篇我觉得很有 ...

  5. VC++6.0中内存泄漏检测 转

    最近看了周星星 Blog 中的一篇文章:"VC++6.0中内存泄漏检测",受益匪浅,便运行其例子代码想看看 Output 窗口中的输出结果,可惜怎么弄其输出都不是预期的东西,郁闷了 ...

  6. C# 使用SDL2进行视频播放窗口截图和字幕添加

    使用SDL2进行视频播放窗口截图和字幕添加 SDL API查看:https://wiki.libsdl.org/APIByCategory 视频截图 /// <summary>/// SD ...

  7. C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片

    本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...

  8. C# 根据窗口句柄获取窗口截图

    C# 根据窗口句柄获取窗口截图 本文经原作者授权以原创方式二次分享,欢迎转载.分享. C# 根据窗口句柄获取窗口截图 作者:唐宋元明清的博客 原文链接:    https://www.cnblogs. ...

  9. Selenium3自动化测试——18.窗口截图

    1. 实现目标 对窗口进行截图,图片保存在脚本的files文件夹下. 2. 实现代码 from selenium import webdriverdriver = webdriver.Chrome() ...

最新文章

  1. 转:PHP Liunx 服务安全防范方案
  2. 本土化App名稱和icon
  3. boost::BoostRegexConcept相关的测试程序
  4. IOT(29)---深入解析物联网操作系统(架构/功能/实例分析)
  5. Centos打开、关闭、结束tomcat,及查看tomcat运行日志
  6. Spark scala和java的api使用
  7. 【礼仪大赛策划方案常识】 什么是正装
  8. 自动驾驶 10-3: 全球导航卫星系统 (GNSS)The Global Navigation Satellite Systems
  9. R语言大作业(四):上海市、东京 1997-2018 年GDP值分析
  10. 网站如何集成支付宝!原来要给钱的
  11. xml文件的概述与应用场景
  12. dubbo源码分析第七篇一服务暴露第三小节一远程暴露内核剖析
  13. Netflix公司Druid应用实践
  14. btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
  15. 数据可视化分析平台开源方案集锦
  16. springboot生成条形码并直接输出显示
  17. 【 Git错误记录(一)】Permissions 0755 for ‘/home/wwww/.ssh/id_rsa_github‘ are too open.
  18. woocommerce 货币符号调整修改
  19. 【OpenCV】132 OpenCV DNN单张与多张图像的推断
  20. webrtc笔记-信令部分(SDP)

热门文章

  1. 当前计算机用户没有管理员权限,两个方法轻松解决Win7没有管理员权限的问题...
  2. [BZOJ3620]似乎在梦中见过的样子(kmp)
  3. 【CVPR 2021】自我知识蒸馏:Self-distillation with Batch Knowledge Ensembling Improves ImageNet Classification
  4. 人工智能从来不是一帆风顺的
  5. 计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing
  6. 易源数据_易源数据-全国景点查询【最新版】_大数据可视化_数据API_数据应用-云市场-阿里云...
  7. 80211无线网络权威指南(七)之RSN、TKIP与CCMP
  8. thymeleaf 引如js文件后 函数不触发
  9. 1174 -- 正三角形的外接圆面积
  10. 期货开户加1分象征性收取