C++ Windows下屏幕截圖

屏幕截圖核心代碼(如果要求高幀率,請使用DxGI):

// RGB到YUV的轉換公式
#define RGB_TO_Y(r, g, b) ((int)((0.299 * (r)) + (0.587 * (g)) + (0.114 * (b))))
#define RGB_TO_U(r, g, b) ((int)((-0.169 * (r)) - (0.331 * (g)) + (0.500 * (b)) + 128))
#define RGB_TO_V(r, g, b) ((int)((0.500 * (r)) - (0.419 * (g)) - (0.081 * (b)) + 128))// 假設輸入圖像是32位ARGB,寬度為width,高度為height,如果是圖像是RGB,下面像素位數4改為3即可
void ConvertRGBToYUV420P(unsigned char* rgbData, int width, int height, unsigned char* yuvData)
{int ySize = width * height;int uvSize = width * height / 4;// 填充Y分量for (int i = 0; i < height; ++i){for (int j = 0; j < width; ++j){int index = i * width + j;yuvData[index] = RGB_TO_Y(rgbData[index * 4], rgbData[index * 4 + 1], rgbData[index * 4 + 2]);}}// 填充U和V分量(下采樣)int uvIndex = ySize;for (int i = 0; i < height; i += 2){for (int j = 0; j < width; j += 2){int rgbIndex = i * width + j;yuvData[uvIndex++] = RGB_TO_U(rgbData[rgbIndex * 4], rgbData[rgbIndex * 4 + 1], rgbData[rgbIndex * 4 + 2]);}}for (int i = 0; i < height; i += 2){for (int j = 0; j < width; j += 2){int rgbIndex = i * width + j;yuvData[uvIndex++] = RGB_TO_V(rgbData[rgbIndex * 4], rgbData[rgbIndex * 4 + 1], rgbData[rgbIndex * 4 + 2]);}}
}void SaveYUV420P(const char* filename, unsigned char* yuvBuffer, int width, int height)
{FILE* file = fopen(filename, "wb");if (!file){AfxMessageBox(_T("Failed to open file for writing!"));return;}int frameSize = width * height * 3 / 2;fwrite(yuvBuffer, 1, frameSize, file);fclose(file);
}void SaveHBitmapToBmpFile(HBITMAP hBitmap, CString path)
{// 定義文件頭結構BITMAPFILEHEADER fileHead;int fileHeadLen = sizeof(BITMAPFILEHEADER);// 定義圖象信息結構BITMAPINFOHEADER bmpHead;int bmpHeadLen = sizeof(BITMAPINFOHEADER);// 獲取HBITMAP對象信息BITMAP bmpObj;GetObject(hBitmap, sizeof(BITMAP), &bmpObj);// 計算文件總的字節大小DWORD fileSizeInByte;CDC srcDC;srcDC.CreateDC(L"DISPLAY", NULL, NULL, NULL);DWORD PixelSizeInBit = srcDC.GetDeviceCaps(BITSPIXEL) * srcDC.GetDeviceCaps(PLANES);fileSizeInByte = fileHeadLen + bmpHeadLen + bmpObj.bmWidth * bmpObj.bmHeight * PixelSizeInBit / 8;// 初始化文件頭結構fileHead.bfOffBits = fileHeadLen + bmpHeadLen;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;fileHead.bfSize = fileSizeInByte;fileHead.bfType = 0x4D42; // 'BM'// 初始圖像信息結構bmpHead.biBitCount = PixelSizeInBit;bmpHead.biClrImportant = 0;bmpHead.biClrUsed = 0;bmpHead.biCompression = BI_RGB;bmpHead.biHeight = -bmpObj.bmHeight;//圖像數據顛倒處理bmpHead.biPlanes = 1;bmpHead.biSize = bmpHeadLen;bmpHead.biSizeImage = bmpObj.bmWidth * bmpObj.bmHeight * PixelSizeInBit / 8;bmpHead.biWidth = bmpObj.bmWidth;bmpHead.biXPelsPerMeter = 0;bmpHead.biYPelsPerMeter = 0;// 創建并打開BMP文件CFile file;if (!file.Open(path, CFile::modeCreate | CFile::modeWrite)){// 處理文件打開失敗的情況return;}// 寫入文件頭和圖象信息頭file.Write(&fileHead, fileHeadLen);file.Write(&bmpHead, bmpHeadLen);// 獲取位圖數據并寫入文件BYTE* pBitmapBits = NULL;BITMAPINFO bmpInfo;ZeroMemory(&bmpInfo, sizeof(BITMAPINFO));bmpInfo.bmiHeader = bmpHead;HDC hDC = GetDC(NULL);HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap);pBitmapBits = new unsigned char[bmpHead.biSizeImage];int nBits = GetDIBits(hDC, hBitmap, 0, bmpObj.bmHeight, pBitmapBits, &bmpInfo, DIB_RGB_COLORS);file.Write(pBitmapBits, bmpHead.biSizeImage);// 轉換RGB到YUV420Punsigned char* yuvBuffer = new unsigned char[bmpObj.bmWidth * bmpObj.bmHeight * 3 / 2];ConvertRGBToYUV420P(pBitmapBits, bmpObj.bmWidth, bmpObj.bmHeight, yuvBuffer);SaveYUV420P("d:\\a.yuv", yuvBuffer, bmpObj.bmWidth, bmpObj.bmHeight);delete[] yuvBuffer;// 恢復原來的位圖對象并釋放資源SelectObject(hDC, hOldBitmap);ReleaseDC(NULL, hDC);delete[] pBitmapBits;// 關閉文件file.Close();
}// 獲取屏幕截圖
HBITMAP CaptureScreen()
{HDC hScreen = GetDC(NULL);HDC hDC = CreateCompatibleDC(hScreen);int width = GetSystemMetrics(SM_CXSCREEN);int height = GetSystemMetrics(SM_CYSCREEN);HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, width, height);SelectObject(hDC, hBitmap);BitBlt(hDC, 0, 0, width, height, hScreen, 0, 0, SRCCOPY);DeleteDC(hDC);ReleaseDC(NULL, hScreen);return hBitmap;
}void CaptureAndSaveScreenAsYUV420P(const char* filename)
{HBITMAP hBitmap = CaptureScreen();SaveHBitmapToBmpFile(hBitmap, _T("d:\\a.bmp"));DeleteObject(hBitmap);
}CaptureAndSaveScreenAsYUV420P("d:\\a.yuv");

該代碼包含了抓取屏幕數據獲取到HBITMAP對象,并根據HBITMAP對象獲取到RGB數據,RGB數據可以保存bmp文件,也可以轉換YUV420P后進行圖像編碼,具體如何使用,各取所需吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71726.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71726.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

修改jupyter notebook的工作空間

今天&#xff0c;我之前R配置jupyter工作空間&#xff0c;講了各種語言內核分配不同的工作空間&#xff0c;雖然是方便管理&#xff0c;但有個問題就是需要每次都進入C盤的配置文件找到notebook的工作空間設置路徑打開修改嘛。 因此&#xff0c;今天我編寫了一個python腳本&am…

江科大51單片機筆記【9】DS1302時鐘可調時鐘(下)

在寫代碼前&#xff0c;記得把上一節的跳線帽給插回去&#xff0c;不然LCD無法顯示 一.DS1302時鐘 1.編寫DS1302.c文件 &#xff08;1&#xff09;重新對端口定義名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;&#xff08;2&#xff09;初始化 因為…

電商行業門店管理軟件架構設計與數據可視化實踐

一、行業痛點與核心訴求 在電商多平臺運營成為主流的背景下,企業普遍面臨三大管理難題: ?數據碎片化:某頭部服飾品牌2023年運營報告顯示,其分布在8個平臺的162家門店,日均產生23萬條訂單數據,但財務部門需要5個工作日才能完成跨平臺利潤核算。?成本核算失真:行業調研…

創新算法!BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測

創新算法&#xff01;BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測 目錄 創新算法&#xff01;BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測預測效果基本介紹BKA-Transformer-BiLSTM黑翅鳶優化算法多變量時間序列預測一、引言1.1、研究背景和意義1.2、…

leetcode 95.不同的二叉搜索樹 Ⅱ

首先分析一下什么是二叉搜索樹。因為我本科學習數據結構的時候就是單純背了一下題庫&#xff0c;考試非常簡單。現在額外補充學一些之前自己沒有學過的內容。有序向量可以二分查找&#xff0c;列表可以快速插入和刪除。二叉搜索樹可以實現按照關鍵碼訪問。call by key .數據表現…

數據安全防線:備份文件的重要性與自動化實踐

在數字化時代&#xff0c;信息已成為企業運營和個人生活的核心資源。無論是企業的核心數據、客戶的敏感信息&#xff0c;還是個人的珍貴照片、重要文檔&#xff0c;這些數據一旦丟失或受損&#xff0c;都可能帶來不可估量的損失。因此&#xff0c;備份文件的重要性不言而喻&…

碰一碰發視頻系統之寫卡功能開發了,支持OEM

一、引言 在碰一碰發視頻系統中&#xff0c;NFC&#xff08;Near Field Communication&#xff0c;近場通信&#xff09;技術扮演著關鍵角色。其中&#xff0c;寫卡功能是實現用戶與系統便捷交互的重要環節&#xff0c;通過將特定的視頻相關信息寫入 NFC 標簽&#xff0c;用戶…

【數據結構初階第十八節】八大排序系列(上篇)—[詳細動態圖解+代碼解析]

看似不起眼的日復一日&#xff0c;總會在某一天讓你看到堅持的意義。??????云邊有個稻草人-CSDN博客 hello&#xff0c;好久不見&#xff01; 目錄 一. 排序的概念及運用 1. 概念 2. 運用 3. 常見排序算法 二. 實現常見排序算法 1. 插入排序 &#xff08;1&…

python爬蟲系列課程8:js瀏覽器window對象屬性

python爬蟲系列課程8:js瀏覽器window對象屬性 一、JavaScript的組成二、document常見屬性對象三、navigator對象一、JavaScript的組成 JavaScript可以分為三個部分:ECMAScript標準、DOM、BOM。 ECMAScript標準:即JS的基本語法,JavaScript的核心,描述了語言的基本語法和數…

快速使用PPASR V3版不能語音識別框架

前言 本文章主要介紹如何快速使用PPASR語音識別框架訓練和推理&#xff0c;本文將致力于最簡單的方式去介紹使用&#xff0c;如果使用更進階功能&#xff0c;還需要從源碼去看文檔。僅需三行代碼即可實現訓練和推理。 源碼地址&#xff1a;https://github.com/yeyupiaoling/P…

cannon g3810打印機設置

現在AI這么厲害&#xff0c;是不是很少人來這里搜索資料了。 不過我還是寫一下。 買了一臺cannon g3810打印機。一直都用USB打印&#xff0c;今天突然想用手機打印。于是又折騰了兩個小時&#xff0c;終于折騰完了。 步驟如下&#xff1a; [1]打開官網&#xff0c;下載佳能…

使用 Arduino 和 ThingSpeak 通過 Internet 進行心跳監測

使用 Arduino 和 ThingSpeak 通過 Internet 進行心跳監測 在這個項目中,我們將使用 Arduino 制作一個心跳檢測和監測系統,該系統將使用脈搏傳感器檢測心跳,并在與其連接的 LCD 上顯示 BPM(每分鐘心跳次數)讀數。它還將使用 Wi-Fi 模塊ESP8266將讀數發送到 ThingSpeak 服務…

vulnhub靶場之【digitalworld.local系列】的snakeoil靶機

前言 靶機&#xff1a;digitalworld.local-snakeoil&#xff0c;IP地址為192.168.10.11 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 kali采用VMware虛擬機&#xff0c;靶機選擇使用VMware打開文件&#xff0c;都選擇橋接網絡 這里官方給的有兩種方式&#xff0…

自行車的主要品牌

一、國際知名品牌&#xff08;專注運動與高端市場&#xff09; 捷安特&#xff08;GIANT&#xff09; 臺灣品牌&#xff0c;全球最大自行車制造商之一&#xff0c;覆蓋山地車、公路車、通勤車等多品類。 美利達&#xff08;MERIDA&#xff09; 臺灣品牌&#xff0c;以山地車…

C語言(隊列)

1、隊列的原理和作用 1、1 隊列的原理 隊列的原理其實就像一個管道&#xff0c;如果我們不斷的往管道里塞乒乓球&#xff0c;每個乒乓球在管道里就會排列一條隊列&#xff0c;先進去的乒乓球會先出來&#xff0c;這個就是隊列先進先出的規則 球從左邊進去的動作叫入列&#xf…

【C++算法】AVL樹的平衡之美:從理論到C++高效實現

AVL樹是一種自平衡二叉搜索樹,解決了普通二叉搜索樹在數據傾斜時的性能退化問題。本文深入探討了AVL樹的理論基礎,包括平衡因子的定義、旋轉操作的數學推導,并通過LaTeX公式分析其時間復雜度。接著,我們用C++實現了一個完整的AVL樹,包括插入、刪除和平衡調整的詳細代碼,附…

黑金風格人像靜物戶外旅拍Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 針對人像、靜物以及戶外旅拍照片&#xff0c;運用 Lightroom 軟件進行風格化調色工作。旨在通過軟件中的多種工具&#xff0c;如基本參數調整、HSL&#xff08;色相、飽和度、明亮度&#xff09;調整、曲線工具等改變照片原本的色彩、明度、對比度等屬性&#xff0c;將…

ESP8266 NodeMCU 與 Atmega16 微控制器連接以發送電子郵件

NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信協議,如 UART、USART、SPI 和 I2C。由于其廣泛的社區支持和簡單性,它在機器人、汽車和自動化行業有廣泛的應用。 Atmega1…

【Hadoop】詳解HDFS

Hadoop 分布式文件系統(HDFS)被設計成適合運行在通用硬件上的分布式文件系統&#xff0c;它是一個高度容錯性的系統&#xff0c;適合部署在廉價的機器上&#xff0c;能夠提供高吞吐量的數據訪問&#xff0c;非常適合大規模數據集上的應用。為了做到可靠性&#xff0c;HDFS創建了…

2025 批量下載市場高標解讀/配置喵/wangdizhe 雪球帖子/文章導出excel和pdf

之前分享過文章2025 批量下載雪球和東方財富文章導出excel和pdf &#xff0c;今天整理分享下我下載過的一些雪球文章。 第1個號市場高標解讀 抓取下載的所有帖子excel數據包含文章日期&#xff0c;文章標題&#xff0c;文章鏈接&#xff0c;文章簡介&#xff0c;點贊數&#…