VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE
最近用到 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相关推荐
- Windows GDI 窗口与 Direct3D 屏幕截图
前言 Windows 上,屏幕截图一般是调用 win32 api 完成的,如果 C# 想实现截图功能,就需要封装相关 api.在 Windows 上,主要图形接口有 GDI 和 DirectX.GDI ...
- 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 ...
- 窗口截图(可指定HWND窗口句柄)
方法一 BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) {HWND hDesktop = ::GetDesktopWindow();ASSERT ...
- VC启动窗口画面制作方法研究
VC启动窗口画面制作方法研究 源代码运行效果图如下: 1. 概述 前几天在设计软件时,选择VC作为开发工具,想做个启动画面,由于以前没有制作过,所以到网上搜了一通.网上有几篇相关文章,有两篇我觉得很有 ...
- VC++6.0中内存泄漏检测 转
最近看了周星星 Blog 中的一篇文章:"VC++6.0中内存泄漏检测",受益匪浅,便运行其例子代码想看看 Output 窗口中的输出结果,可惜怎么弄其输出都不是预期的东西,郁闷了 ...
- C# 使用SDL2进行视频播放窗口截图和字幕添加
使用SDL2进行视频播放窗口截图和字幕添加 SDL API查看:https://wiki.libsdl.org/APIByCategory 视频截图 /// <summary>/// SD ...
- C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片
本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...
- C# 根据窗口句柄获取窗口截图
C# 根据窗口句柄获取窗口截图 本文经原作者授权以原创方式二次分享,欢迎转载.分享. C# 根据窗口句柄获取窗口截图 作者:唐宋元明清的博客 原文链接: https://www.cnblogs. ...
- Selenium3自动化测试——18.窗口截图
1. 实现目标 对窗口进行截图,图片保存在脚本的files文件夹下. 2. 实现代码 from selenium import webdriverdriver = webdriver.Chrome() ...
最新文章
- 转:PHP Liunx 服务安全防范方案
- 本土化App名稱和icon
- boost::BoostRegexConcept相关的测试程序
- IOT(29)---深入解析物联网操作系统(架构/功能/实例分析)
- Centos打开、关闭、结束tomcat,及查看tomcat运行日志
- Spark scala和java的api使用
- 【礼仪大赛策划方案常识】 什么是正装
- 自动驾驶 10-3: 全球导航卫星系统 (GNSS)The Global Navigation Satellite Systems
- R语言大作业(四):上海市、东京 1997-2018 年GDP值分析
- 网站如何集成支付宝!原来要给钱的
- xml文件的概述与应用场景
- dubbo源码分析第七篇一服务暴露第三小节一远程暴露内核剖析
- Netflix公司Druid应用实践
- btrfs和ntfs linux5,如何选择文件系统EXT4、Btrfs 和 XFS
- 数据可视化分析平台开源方案集锦
- springboot生成条形码并直接输出显示
- 【 Git错误记录(一)】Permissions 0755 for ‘/home/wwww/.ssh/id_rsa_github‘ are too open.
- woocommerce 货币符号调整修改
- 【OpenCV】132 OpenCV DNN单张与多张图像的推断
- webrtc笔记-信令部分(SDP)
热门文章
- 当前计算机用户没有管理员权限,两个方法轻松解决Win7没有管理员权限的问题...
- [BZOJ3620]似乎在梦中见过的样子(kmp)
- 【CVPR 2021】自我知识蒸馏:Self-distillation with Batch Knowledge Ensembling Improves ImageNet Classification
- 人工智能从来不是一帆风顺的
- 计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing
- 易源数据_易源数据-全国景点查询【最新版】_大数据可视化_数据API_数据应用-云市场-阿里云...
- 80211无线网络权威指南(七)之RSN、TKIP与CCMP
- thymeleaf 引如js文件后 函数不触发
- 1174 -- 正三角形的外接圆面积
- 期货开户加1分象征性收取