中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小

怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小

發布時間:2023-04-08 15:32:03 來源:億速云 閱讀:232 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”文章能幫助大家解決問題。

一,函數清單

1.Direct3DCreate9 函數

Direct3DCreate9 函數創建 IDirect3D9 對象并返回一個接口。

IDirect3D9 * Direct3DCreate9(
  UINT SDKVersion
);
  • 參數:SDKVersion

  • 返回值:如果成功,此函數將返回指向 IDirect3D9 接口的指針;否則,返回 NULL 指針。

2.IDirect3D9::CreateDevice 方法

創建一個設備來表示顯示適配器。

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。

3.IDirect3DDevice9::GetDisplayMode 方法

檢索顯示模式的空間分辨率、顏色分辨率和刷新頻率。

HRESULT GetDisplayMode(
  [in]  UINT           iSwapChain,
  [out] D3DDISPLAYMODE *pMode
);
  • 參數:點擊函數名稱跳轉即可查看詳細介紹

  • 返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則可以D3DERR_INVALIDCALL返回值。

4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法

創建屏幕外圖面。

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。

5.IDirect3DDevice9::GetFrontBufferData 方法

生成設備的前緩沖區的副本,并將該副本放置在應用程序提供的系統內存緩沖區中。

HRESULT GetFrontBufferData(
  [in] UINT              iSwapChain,
  [in] IDirect3DSurface9 *pDestSurface
);
  • 參數:點擊函數名稱跳轉即可查看詳細介紹

  • 返回值:如果方法成功,則返回值D3D_OK。 如果方法失敗,則返回值可以是下列值之一:D3DERR_DRIVERINTERNALERROR、D3DERR_DEVICELOST、D3DERR_INVALIDCALL。

6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法

通過顏色轉換從另一個圖面加載圖面。

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。

7. D3DXSaveSurfaceToFile 函數

將圖面保存到文件。

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.d3d下載和工程屬性頁配置d3d

1.點擊 Direct3D鏈接 下載,然后點擊 exe 進行安裝,安裝好后內容如下:

怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小

2.工程配置d3d的依賴:在VC++目錄中配置 d3d 的包含目錄和庫目錄(注意:庫目錄的位數要和解決方案平臺的位數一致)

怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小

2.全部實現代碼

#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;
}

3.最終展示效果

打開工程所在的目錄,然后會看到有一張圖片,圖片效果如下,沒有看錯!就是一張圖片!(溫馨提示:該圖片是通過代碼截的,不是我自己截的哦)

怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小

關于“怎么使用C++和Direct3D獲取屏幕截圖并根據傳入分辨率進行縮放圖片大小”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马龙县| 莱西市| 深圳市| 高阳县| 衢州市| 吉林省| 康平县| 曲周县| 文山县| 蒙山县| 克拉玛依市| 厦门市| 元氏县| 老河口市| 盱眙县| 抚宁县| 巴青县| 安阳市| 丁青县| SHOW| 贵港市| 班戈县| 甘德县| 石景山区| 仙游县| 临澧县| 洛宁县| 周宁县| 蒲江县| 南召县| 龙江县| 扎赉特旗| 林西县| 赞皇县| 呈贡县| 扎囊县| 剑河县| 太和县| 托克逊县| 盐津县| 固阳县|