目錄
一,函數(shù)清單
1.Direct3DCreate9?函數(shù)
2.IDirect3D9::CreateDevice 方法
3.IDirect3DDevice9::GetDisplayMode?方法
4.IDirect3DDevice9::CreateOffscreenPlainSurface?方法
5.IDirect3DDevice9::GetFrontBufferData?方法
6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法
7.?D3DXSaveSurfaceToFile 函數(shù)
二,關(guān)鍵代碼實(shí)現(xiàn)
三,最終實(shí)現(xiàn)和展示效果
1.d3d下載和工程屬性頁(yè)配置d3d
2.全部實(shí)現(xiàn)代碼
3.最終展示效果
一,函數(shù)清單
1.Direct3DCreate9?函數(shù)
Direct3DCreate9 函數(shù)創(chuàng)建 IDirect3D9 對(duì)象并返回一個(gè)接口。
IDirect3D9 * Direct3DCreate9(
? UINT SDKVersion
);
- 參數(shù):SDKVersion
- 返回值:如果成功,此函數(shù)將返回指向?IDirect3D9?接口的指針;否則,返回?NULL?指針。
2.IDirect3D9::CreateDevice 方法
創(chuàng)建一個(gè)設(shè)備來表示顯示適配器。
HRESULT CreateDevice(
[in] UINT Adapter,
[in] D3DDEVTYPE DeviceType,
[in] HWND hFocusWindow,
[in] DWORD BehaviorFlags,
[in, out] D3DPRESENT_PARAMETERS *pPresentationParameters,
[out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果該方法成功,則返回值為 D3D_OK。如果該方法失敗,則返回值可以是以下之一:D3DERR_DEVICELOST、D3DERR_INVALIDCALL、D3DERR_NOTAVAILABLE、D3DERR_OUTOFVIDEOMEMORY。
3.IDirect3DDevice9::GetDisplayMode?方法
檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。
HRESULT GetDisplayMode(
[in] UINT iSwapChain,
[out] D3DDISPLAYMODE *pMode
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則可以D3DERR_INVALIDCALL返回值。
4.IDirect3DDevice9::CreateOffscreenPlainSurface?方法
創(chuàng)建屏幕外圖面。
HRESULT CreateOffscreenPlainSurface(
[in] UINT Width,
[in] UINT Height,
[in] D3DFORMAT Format,
[in] D3DPOOL Pool,
[out, retval] IDirect3DSurface9 **ppSurface,
[in] HANDLE *pSharedHandle
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則返回值可以是以下值:D3DERR_INVALIDCALL。
5.IDirect3DDevice9::GetFrontBufferData?方法
生成設(shè)備的前緩沖區(qū)的副本,并將該副本放置在應(yīng)用程序提供的系統(tǒng)內(nèi)存緩沖區(qū)中。
HRESULT GetFrontBufferData(
[in] UINT iSwapChain,
[in] IDirect3DSurface9 *pDestSurface
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則返回值可以是下列值之一:D3DERR_DRIVERINTERNALERROR、D3DERR_DEVICELOST、D3DERR_INVALIDCALL。
6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法
通過顏色轉(zhuǎn)換從另一個(gè)圖面加載圖面。
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
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果函數(shù)成功,則返回值D3D_OK。 如果函數(shù)失敗,則返回值可以是以下值之一:D3DERR_INVALIDCALL、D3DXERR_INVALIDDATA。
7.?D3DXSaveSurfaceToFile 函數(shù)
將圖面保存到文件。
HRESULT D3DXSaveSurfaceToFile(
_In_???????LPCTSTR ?????????????pDestFile,
_In_???????D3DXIMAGE_FILEFORMAT DestFormat,
_In_???????LPDIRECT3DSURFACE9 ??pSrcSurface,
_In_?const PALETTEENTRY ????????*pSrcPalette,
_In_?const RECT ????????????????*pSrcRect
);
- 參數(shù):點(diǎn)擊函數(shù)名稱跳轉(zhuǎn)即可查看詳細(xì)介紹
- 返回值:如果函數(shù)成功,則返回值D3D_OK。 如果函數(shù)失敗,則返回值可能如下所示:D3DERR_INVALIDCALL。
二,關(guān)鍵代碼實(shí)現(xiàn)
1.創(chuàng)建 IDirect3D9 對(duì)象
LPDIRECT3D9 pD3D = nullptr; //Direct3D 對(duì)象是圖形應(yīng)用程序需要?jiǎng)?chuàng)建的第一個(gè) Direct3D COM 對(duì)象,也是應(yīng)用程序需要釋放的最后一個(gè)對(duì)象
if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{//創(chuàng)建 IDirect3D9 對(duì)象并返回一個(gè)接口。
return E_FAIL;
}
2.初始化用于創(chuàng)建 Direct3D 設(shè)備的?D3DPRESENT_PARAMETERS?結(jié)構(gòu)的值。
LPDIRECT3DDEVICE9 pDevice = nullptr;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE; //如果應(yīng)用程序運(yùn)行窗口,則為 TRUE;如果應(yīng)用程序全屏運(yùn)行,則為 FALSE。
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; //運(yùn)行時(shí)將保證有關(guān)緩沖區(qū)交換行為的隱式語(yǔ)義;
3.接下來,創(chuàng)建 Direct3D 設(shè)備
if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
{//創(chuàng)建一個(gè)設(shè)備來表示顯示適配器。指定默認(rèn)適配器、硬件抽象層 (HAL) 設(shè)備和軟件頂點(diǎn)處理。
return E_FAIL;
}
4.獲取屏幕截圖接口實(shí)現(xiàn)
IDirect3DSurface9* GetScreenShot(IDirect3DDevice9* pDevice) {
IDirect3DSurface9* pSurface = nullptr;
D3DDISPLAYMODE displayMode;
//檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。
pDevice->GetDisplayMode(0, &displayMode);
std::cout << displayMode.Width << displayMode.Height << std::endl;
//創(chuàng)建屏幕外圖面。
HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
if (FAILED(hr)) {
return nullptr;
}
//生成設(shè)備的前緩沖區(qū)的副本,并將該副本放置在應(yīng)用程序提供的系統(tǒng)內(nèi)存緩沖區(qū)中。
hr = pDevice->GetFrontBufferData(0, pSurface);
if (FAILED(hr)) {
return nullptr;
}
return pSurface;
}
5.縮放圖片接口實(shí)現(xiàn)
IDirect3DSurface9* ResizeSurface(IDirect3DDevice9* pDevice, IDirect3DSurface9* pSrcSurface, int width, int height) {
IDirect3DSurface9* pDestSurface = nullptr;
//創(chuàng)建屏幕外圖面。
HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL);
if (FAILED(hr)) {
return nullptr;
}
//通過顏色轉(zhuǎn)換從另一個(gè)圖面加載圖面。
D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
return pDestSurface;
}
三,最終實(shí)現(xiàn)和展示效果
1.d3d下載和工程屬性頁(yè)配置d3d
1.點(diǎn)擊?Direct3D鏈接?下載,然后點(diǎn)擊 exe 進(jìn)行安裝,安裝好后內(nèi)容如下:
2.工程配置d3d的依賴:在VC++目錄中配置 d3d 的包含目錄和庫(kù)目錄(注意:庫(kù)目錄的位數(shù)要和解決方案平臺(tái)的位數(shù)一致)
?
2.全部實(shí)現(xiàn)代碼
#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;
//創(chuàng)建屏幕外圖面。
HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
if (FAILED(hr)) {
return nullptr;
}
//生成設(shè)備的前緩沖區(qū)的副本,并將該副本放置在應(yīng)用程序提供的系統(tǒng)內(nèi)存緩沖區(qū)中。
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;
//創(chuàng)建屏幕外圖面。
HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL);
if (FAILED(hr)) {
return nullptr;
}
//通過顏色轉(zhuǎn)換從另一個(gè)圖面加載圖面。
D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
return pDestSurface;
}
int main() {
// 1.初始化 Direct3D 設(shè)備
LPDIRECT3D9 pD3D = nullptr; //Direct3D 對(duì)象是圖形應(yīng)用程序需要?jiǎng)?chuàng)建的第一個(gè) Direct3D COM 對(duì)象,也是應(yīng)用程序需要釋放的最后一個(gè)對(duì)象
if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{//創(chuàng)建 IDirect3D9 對(duì)象并返回一個(gè)接口。
return E_FAIL;
}
// 2.創(chuàng)建 Direct3D 設(shè)備
LPDIRECT3DDEVICE9 pDevice = nullptr;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE; //如果應(yīng)用程序運(yùn)行窗口,則為 TRUE;如果應(yīng)用程序全屏運(yùn)行,則為 FALSE。
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; //運(yùn)行時(shí)將保證有關(guān)緩沖區(qū)交換行為的隱式語(yǔ)義;
if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
{//創(chuàng)建一個(gè)設(shè)備來表示顯示適配器。指定默認(rèn)適配器、硬件抽象層 (HAL) 設(shè)備和軟件頂點(diǎn)處理。
return E_FAIL;
}
// 3.獲取屏幕截圖
IDirect3DSurface9* pSrcSurface = GetScreenShot(pDevice);
// 4.縮放圖片(可用可不用)
int targetWidth = 1920; // 目標(biāo)寬度
int targetHeight = 1080; // 目標(biāo)高度
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;
}
3.最終展示效果
打開工程所在的目錄,然后會(huì)看到有一張圖片,圖片效果如下,沒有看錯(cuò)!就是一張圖片?。剀疤崾荆涸搱D片是通過代碼截的,不是我自己截的哦)文章來源:http://www.zghlxwxcb.cn/news/detail-801343.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-801343.html
到了這里,關(guān)于【C/C++】使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!