用WindowsAPI截屏并转换为RGB格式

在Windows下捕获屏幕图像可以有多重方法,比较简单可以调用第三方库,如Qt的屏幕截屏API就很容易调用。

在这里介绍如何用Windows API实现截屏并转换成RGB格式存储。

#include <windows.h>
//最终f的内存布局为BGRA格式,需要保证buf长度足够(>w*h*4)
void ScreenCap(void* buf, int* w, int* h)
{

    HWND hDesk = GetDesktopWindow();
    HDC hScreen = GetDC(hDesk);
    int width = GetDeviceCaps(hScreen, HORZRES);
    int height = GetDeviceCaps(hScreen, VERTRES);

    if (w != 0)
        *w = width;
    if (h != 0)
        *h = height;

    HDC hdcMem = CreateCompatibleDC(hScreen);
    HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);

    BITMAPINFOHEADER bmi = { 0 };
    bmi.biSize = sizeof(BITMAPINFOHEADER);
    bmi.biPlanes = 1;
    bmi.biBitCount = 32;
    bmi.biWidth = width;
    bmi.biHeight = -height;
    bmi.biCompression = BI_RGB;
    bmi.biSizeImage = width*height;

    SelectObject(hdcMem, hBitmap);
    BitBlt(hdcMem, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);

    GetDIBits(hdcMem, hBitmap, 0, height, buf, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);

    DeleteDC(hdcMem);
    ReleaseDC(hDesk, hScreen);
    CloseWindow(hDesk);
    DeleteObject(hBitmap);
}
时间: 2024-08-30 04:26:49

用WindowsAPI截屏并转换为RGB格式的相关文章

[00011]-[2015-08-26]-[00]-[Windows 程序设计 ---MFC 截屏---&gt;BMP格式 ---&gt;JPG格式]

HBITMAP CopyScreenToBitmap(LPRECT lpRect){ HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 位图宽度和高度 int xScrn, yScrn; // 屏幕分辨率 if (IsRectEmpty(lpRect)) return NULL; hScrDC

YUY数据转换为RGB数据,并进行灰度化处理显示

BYTE clip255(long Value){ BYTE retValue;  if (Value > 255)  retValue = 255; else if (Value < 0)  retValue = 0; else  retValue = (BYTE)Value; return retValue;}//win7采到的数据默认YUY格式,一个像素用2位表示,这里将YUY转换为RGB格式(3个字节),便于显示,不转换会出现黑框框void YUY2_RGB2_ljh(unsigned

YUV格式转换为RGB(基于opencv)

之前写代码过程中需要将YUV格式视频中每帧提取出来,然后保存为图片.网上普遍有两种方法,第一种是通过opencv自带cvCvtColor,但是这种方法有bug,得到的图片会泛白.第二种方法是公式法. 法一:opencv自带cvCvtColor 说明:这种方法会出现图片"泛白",具体原因网上是说cvCvtColor这个函数左右协议不同,不太懂. 代码: void FileWriteFrames(){ char *filename = "E:\\openCV\\zhang\\yu

c++ bitmap 截屏 MFC

****首先感谢巨人的肩膀,让小白能够走出bitmap图片的苦海.**** 自己闲的没事想通过c++ 的MFC来截屏并上传服务器展示客户端的当前界面.中间一路降妖伏魔....(此处省略2048个字节),发扬程序猿无私奉献的优良品质,分享源代码来众生同乐. 1.好戏在前头,请在.h添加下面这些东东.... typedef struct _BMPINFO { int  bmpWidth;//图像的宽 int  bmpHeight;//图像的高 int  biBitCount;//图像类型,每像素位数

MonoGame 3.2 下,截屏与 Texture2D 的保存

注意,由于采用的是 MonoGame 3.2,因此方法与 XNA 4.0 不完全相同. 目标是将当前 GraphicsDevice 的内容保存为一个 Texture2D,同时还要能输出至文件. 截屏,在 XNA 下早就有人做了,例如这个:XNA4.0 保存屏幕截图方法[1]. 同时,针对 Texture.SaveAsPng()(XNA 下),也有人早就发现了其内存泄露问题,并写出了自己的解决方案:Texture2d.SaveAsPng() Memory Leak[2]. 不过 MonoGame

用phantomjs 进行网页整页截屏

写截取整个网页程序是一个做前台的哥们所托,要做一些漂亮的界面原形,参考一些不错的网站设计就帮他弄了个截屏的程序. phantomjs   是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,这样访问网页就省去了浏览器的界面绘制所消耗的系统资源,比较适合用于网络测试等应用 .我只是调用了其中的一个截取网页的小功能,可以完美的解析网页的js和css 而且兼容html5,不过最新的1.5版本不支持flash,所以我采用了1.4的版本,能够得到完整的网页体验. 先看看执行的效率(4M

C#使用phantomjs 进行网页整页截屏

hantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,这样访问网页就省去了浏览器的界面绘制所消耗的系统资源,比较适合用于网络测试等应用 .我只是调用了其中的一个截取网页的小功能,可以完美的解析网页的js和css 而且兼容html5,不过最新的1.5版本不支持flash,所以我采用了1.4的版本,能够得到完整的网页体验. 先看看执行的效率(4M电信,22:30点测试): phantomjs的目录结构 dll挺多的 都是必须的 codecs里面包含编码信息 qcn

Snipaste强大离线/在线截屏软件的下载、安装和使用

步骤一: https://zh.snipaste.com/  ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网.ttps://zh.snipaste.com  按F1开始截屏 感谢下面哥的精彩微信文章 http://mp.weixin.qq.com/s?__biz=MzIwNzYwODYwMw==&mid=2247483903&idx=1&sn=02121fe920320bbe7b2fae012a18e70a&chksm=970e8f8ba

Java邮件发送与屏幕截屏

前几天七夕情人节孤独寂寞的程序猿闲来没事,花了一两个小时写了个小Demo主要实现Java的Mail发送功能和桌面截屏功能. 首先让我们先看看Java sendMail邮件发送和桌面屏幕截屏功能是怎么实现的基础知识. 一.Java  SendMail邮件发送 首先让我们来看看邮件发送的原理图: JavaMail 是一套sun 提供开发邮件收发程序API,JavaMail编写程序就是邮件客户端程序(和outlook.foxmail功能类似) * JavaMail开发需要类库 javamail API