最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小(最新推薦)

 更新時間:2023年04月06日 14:51:59   作者:拉伊卜  
這篇文章主要介紹了使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小,本文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一,函數(shù)清單

1.Direct3DCreate9 函數(shù)

Direct3DCreate9 函數(shù)創(chuàng)建 IDirect3D9 對象并返回一個接口。

IDirect3D9 * Direct3DCreate9(
  UINT SDKVersion
);
  • 參數(shù):SDKVersion
  • 返回值:如果成功,此函數(shù)將返回指向 IDirect3D9 接口的指針;否則,返回 NULL 指針。

2.IDirect3D9::CreateDevice 方法

創(chuàng)建一個設(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)換從另一個圖面加載圖面。

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)鍵代碼實現(xiàn)

1.創(chuàng)建 IDirect3D9 對象

LPDIRECT3D9 pD3D = nullptr;     //Direct3D 對象是圖形應(yīng)用程序需要創(chuàng)建的第一個 Direct3D COM 對象,也是應(yīng)用程序需要釋放的最后一個對象
if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{//創(chuàng)建 IDirect3D9 對象并返回一個接口。
    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)行時將保證有關(guān)緩沖區(qū)交換行為的隱式語義;

3.接下來,創(chuàng)建 Direct3D 設(shè)備

if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
{//創(chuàng)建一個設(shè)備來表示顯示適配器。指定默認(rèn)適配器、硬件抽象層 (HAL) 設(shè)備和軟件頂點(diǎn)處理。
        return E_FAIL;
}

4.獲取屏幕截圖接口實現(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.縮放圖片接口實現(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)換從另一個圖面加載圖面。
    D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
 
    return pDestSurface;
}

三,最終實現(xiàn)和展示效果

1.d3d下載和工程屬性頁配置d3d

1.點(diǎn)擊 Direct3D鏈接 下載,然后點(diǎn)擊 exe 進(jìn)行安裝,安裝好后內(nèi)容如下:

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

2.全部實現(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)換從另一個圖面加載圖面。
    D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);
 
    return pDestSurface;
}
 
int main() {
    // 1.初始化 Direct3D 設(shè)備
    LPDIRECT3D9 pD3D = nullptr;     //Direct3D 對象是圖形應(yīng)用程序需要創(chuàng)建的第一個 Direct3D COM 對象,也是應(yīng)用程序需要釋放的最后一個對象
    if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    {//創(chuàng)建 IDirect3D9 對象并返回一個接口。
        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)行時將保證有關(guān)緩沖區(qū)交換行為的隱式語義;
    if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
    {//創(chuàng)建一個設(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.最終展示效果

打開工程所在的目錄,然后會看到有一張圖片,圖片效果如下,沒有看錯!就是一張圖片?。剀疤崾荆涸搱D片是通過代碼截的,不是我自己截的哦)

到此這篇關(guān)于使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小(最新推薦)的文章就介紹到這了,更多相關(guān)C++ Direct3D屏幕截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中函數(shù)參數(shù)的入棧順序詳解及實例

    C語言中函數(shù)參數(shù)的入棧順序詳解及實例

    這篇文章主要介紹了C語言中函數(shù)參數(shù)的入棧順序詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C語言實現(xiàn)英文文本詞頻統(tǒng)計

    C語言實現(xiàn)英文文本詞頻統(tǒng)計

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)英文文本詞頻統(tǒng)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 使用C語言實現(xiàn)vector動態(tài)數(shù)組的實例分享

    使用C語言實現(xiàn)vector動態(tài)數(shù)組的實例分享

    vector是指能夠存放任意類型的動態(tài)數(shù)組,而C語言中并沒有面向?qū)ο蟮腃++那樣內(nèi)置vector類,所以我們接下來就來看一下使用C語言實現(xiàn)vector動態(tài)數(shù)組的實例,需要的朋友可以參考下
    2016-05-05
  • C++實現(xiàn)不能被繼承的類實例分析

    C++實現(xiàn)不能被繼承的類實例分析

    這篇文章主要介紹了C++實現(xiàn)不能被繼承的類實例分析,對于C++初學(xué)者而言可以通過本文實例更好的理解類的原理及運(yùn)用,需要的朋友可以參考下
    2014-08-08
  • C++非遞歸建立二叉樹實例

    C++非遞歸建立二叉樹實例

    這篇文章主要介紹了C++非遞歸建立二叉樹的方法,實例分析了二叉樹的原理與C++實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C語言利用system調(diào)用系統(tǒng)命令行詳情

    C語言利用system調(diào)用系統(tǒng)命令行詳情

    這篇文章主要介紹了C語言利用system調(diào)用系統(tǒng)命令行詳情,system就是調(diào)用系統(tǒng)命令行,輸入為字符串,然后把這個字符串輸出給命令行,讓命令行執(zhí)行。下文的具體內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • google c++程序測試框架googletest使用教程詳解

    google c++程序測試框架googletest使用教程詳解

    &#8203;GoogleTest 是 Google 的 C++ 測試和模擬框架,可以幫助程序員測試C++程序的結(jié)果預(yù)期,這篇文章主要介紹了google c++程序測試框架googletest使用教程,需要的朋友可以參考下
    2021-08-08
  • 基于MFC實現(xiàn)多線程進(jìn)度條

    基于MFC實現(xiàn)多線程進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了如何基于MFC實現(xiàn)多線程進(jìn)度條效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • c++輸出斐波那契數(shù)列示例分享

    c++輸出斐波那契數(shù)列示例分享

    這篇文章主要介紹了c++輸出斐波那契數(shù)列示例,需要的朋友可以參考下
    2014-03-03
  • C語言數(shù)組超詳細(xì)講解上

    C語言數(shù)組超詳細(xì)講解上

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計算機(jī)內(nèi)存里連續(xù)存放,地址編號最低的存儲單元存放數(shù)組的起始元素,地址編號最高的存儲單元存放數(shù)組的最后一個元素
    2022-04-04

最新評論

留坝县| 宁明县| 大埔区| 女性| 孙吴县| 齐齐哈尔市| 西平县| 长治市| 宜黄县| 福贡县| 嘉定区| 广东省| 西宁市| 德州市| 东丰县| 宜城市| 都兰县| 景宁| 明溪县| 瑞丽市| 万全县| 宁海县| 汨罗市| 正宁县| 曲阳县| 凤城市| 红桥区| 洪洞县| 华安县| 凭祥市| 大丰市| 阿克苏市| 博湖县| 通化市| 清新县| 汪清县| 苍山县| 轮台县| 高雄市| 正定县| 五台县|