您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”文章能幫助大家解決問題。
Direct3DCreate9 函數創建 IDirect3D9 對象并返回一個接口。
IDirect3D9 * Direct3DCreate9( UINT SDKVersion );
參數:SDKVersion
返回值:如果成功,此函數將返回指向 IDirect3D9 接口的指針;否則,返回 NULL 指針。
創建一個設備來表示顯示適配器。
HRESULT CreateDevice( [in] UINT Adapter, [in] D3DDEVTYPE DeviceType, [in] HWND hFocusWindow, [in] DWORD BehaviorFlags, [in, out] D3DPRESENT_PARAMETERS *pPresentationParameters, [out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果該方法成功,則返回值為 D3D_OK。如果該方法失敗,則返回值可以是以下之一:D3DERR_DEVICELOST、D3DERR_INVALIDCALL、D3DERR_NOTAVAILABLE、D3DERR_OUTOFVIDEOMEMORY。
檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。
HRESULT GetDisplayMode( [in] UINT iSwapChain, [out] D3DDISPLAYMODE *pMode );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則可以D3DERR_INVALIDCALL返回值。
創建屏幕外圖面。
HRESULT CreateOffscreenPlainSurface( [in] UINT Width, [in] UINT Height, [in] D3DFORMAT Format, [in] D3DPOOL Pool, [out, retval] IDirect3DSurface9 **ppSurface, [in] HANDLE *pSharedHandle );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則返回值可以是以下值:D3DERR_INVALIDCALL。
生成設備的前緩沖區的副本,并將該副本放置在應用程序提供的系統內存緩沖區中。
HRESULT GetFrontBufferData( [in] UINT iSwapChain, [in] IDirect3DSurface9 *pDestSurface );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則返回值可以是下列值之一:D3DERR_DRIVERINTERNALERROR、D3DERR_DEVICELOST、D3DERR_INVALIDCALL。
通過顏色轉換從另一個圖面加載圖面。
HRESULT D3DXLoadSurfaceFromSurface( _In_ LPDIRECT3DSURFACE9 pDestSurface, _In_ const PALETTEENTRY *pDestPalette, _In_ const RECT *pDestRect, _In_ LPDIRECT3DSURFACE9 pSrcSurface, _In_ const PALETTEENTRY *pSrcPalette, _In_ const RECT *pSrcRect, _In_ DWORD Filter, _In_ D3DCOLOR ColorKey );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果函數成功,則返回值D3D_OK。 如果函數失敗,則返回值可以是以下值之一:D3DERR_INVALIDCALL、D3DXERR_INVALIDDATA。
將圖面保存到文件。
HRESULT D3DXSaveSurfaceToFile( _In_ LPCTSTR pDestFile, _In_ D3DXIMAGE_FILEFORMAT DestFormat, _In_ LPDIRECT3DSURFACE9 pSrcSurface, _In_ const PALETTEENTRY *pSrcPalette, _In_ const RECT *pSrcRect );
參數:點擊函數名稱跳轉即可查看詳細介紹
返回值:如果函數成功,則返回值D3D_OK。 如果函數失敗,則返回值可能如下所示:D3DERR_INVALIDCALL。
1.創建 IDirect3D9 對象
LPDIRECT3D9 pD3D = nullptr; //Direct3D 對象是圖形應用程序需要創建的第一個 Direct3D COM 對象,也是應用程序需要釋放的最后一個對象 if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION))) {//創建 IDirect3D9 對象并返回一個接口。 return E_FAIL; }
2.初始化用于創建 Direct3D 設備的 D3DPRESENT_PARAMETERS 結構的值。
LPDIRECT3DDEVICE9 pDevice = nullptr; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; //如果應用程序運行窗口,則為 TRUE;如果應用程序全屏運行,則為 FALSE。 d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; //運行時將保證有關緩沖區交換行為的隱式語義;
3.接下來,創建 Direct3D 設備
if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice))) {//創建一個設備來表示顯示適配器。指定默認適配器、硬件抽象層 (HAL) 設備和軟件頂點處理。 return E_FAIL; }
4.獲取屏幕截圖接口實現
IDirect3DSurface9* GetScreenShot(IDirect3DDevice9* pDevice) { IDirect3DSurface9* pSurface = nullptr; D3DDISPLAYMODE displayMode; //檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。 pDevice->GetDisplayMode(0, &displayMode); std::cout << displayMode.Width << displayMode.Height << std::endl; //創建屏幕外圖面。 HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL); if (FAILED(hr)) { return nullptr; } //生成設備的前緩沖區的副本,并將該副本放置在應用程序提供的系統內存緩沖區中。 hr = pDevice->GetFrontBufferData(0, pSurface); if (FAILED(hr)) { return nullptr; } return pSurface; }
5.縮放圖片接口實現
IDirect3DSurface9* ResizeSurface(IDirect3DDevice9* pDevice, IDirect3DSurface9* pSrcSurface, int width, int height) { IDirect3DSurface9* pDestSurface = nullptr; //創建屏幕外圖面。 HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL); if (FAILED(hr)) { return nullptr; } //通過顏色轉換從另一個圖面加載圖面。 D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0); return pDestSurface; }
1.點擊 Direct3D鏈接 下載,然后點擊 exe 進行安裝,安裝好后內容如下:
2.工程配置d3d的依賴:在VC++目錄中配置 d3d 的包含目錄和庫目錄(注意:庫目錄的位數要和解決方案平臺的位數一致)
#include <iostream> #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") // 獲取屏幕截圖 IDirect3DSurface9* GetScreenShot(IDirect3DDevice9* pDevice) { IDirect3DSurface9* pSurface = nullptr; D3DDISPLAYMODE displayMode; //檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。 pDevice->GetDisplayMode(0, &displayMode); std::cout << displayMode.Width << displayMode.Height << std::endl; //創建屏幕外圖面。 HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL); if (FAILED(hr)) { return nullptr; } //生成設備的前緩沖區的副本,并將該副本放置在應用程序提供的系統內存緩沖區中。 hr = pDevice->GetFrontBufferData(0, pSurface); if (FAILED(hr)) { return nullptr; } return pSurface; } // 縮放圖片 IDirect3DSurface9* ResizeSurface(IDirect3DDevice9* pDevice, IDirect3DSurface9* pSrcSurface, int width, int height) { IDirect3DSurface9* pDestSurface = nullptr; //創建屏幕外圖面。 HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL); if (FAILED(hr)) { return nullptr; } //通過顏色轉換從另一個圖面加載圖面。 D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0); return pDestSurface; } int main() { // 1.初始化 Direct3D 設備 LPDIRECT3D9 pD3D = nullptr; //Direct3D 對象是圖形應用程序需要創建的第一個 Direct3D COM 對象,也是應用程序需要釋放的最后一個對象 if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION))) {//創建 IDirect3D9 對象并返回一個接口。 return E_FAIL; } // 2.創建 Direct3D 設備 LPDIRECT3DDEVICE9 pDevice = nullptr; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; //如果應用程序運行窗口,則為 TRUE;如果應用程序全屏運行,則為 FALSE。 d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; //運行時將保證有關緩沖區交換行為的隱式語義; if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice))) {//創建一個設備來表示顯示適配器。指定默認適配器、硬件抽象層 (HAL) 設備和軟件頂點處理。 return E_FAIL; } // 3.獲取屏幕截圖 IDirect3DSurface9* pSrcSurface = GetScreenShot(pDevice); // 4.縮放圖片(可用可不用) int targetWidth = 1920; // 目標寬度 int targetHeight = 1080; // 目標高度 IDirect3DSurface9* pDestSurface = ResizeSurface(pDevice, pSrcSurface, targetWidth, targetHeight); // 5.保存圖片(保存到工程所在的目錄下) D3DXSaveSurfaceToFile(L"screenshot.jpg", D3DXIFF_JPG, pDestSurface, NULL, NULL); // 6.釋放資源 pDestSurface->Release(); pSrcSurface->Release(); pDevice->Release(); pD3D->Release(); return 0; }
打開工程所在的目錄,然后會看到有一張圖片,圖片效果如下,沒有看錯!就是一張圖片!(溫馨提示:該圖片是通過代碼截的,不是我自己截的哦)
關于“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。