国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了【C/C++】使用C++和Direct3D (d3d)獲取屏幕截圖并根據(jù)傳入分辨率進(jìn)行縮放圖片大小。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一,函數(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)容如下:

截屏源碼支持3d c++,C/C++,c++,開發(fā)語(yǔ)言

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

截屏源碼支持3d c++,C/C++,c++,開發(fā)語(yǔ)言?

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片是通過代碼截的,不是我自己截的哦)

截屏源碼支持3d c++,C/C++,c++,開發(fā)語(yǔ)言文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Direct3D繪制旋轉(zhuǎn)立方體例程

    Direct3D繪制旋轉(zhuǎn)立方體例程

    初始化文件見Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp 運(yùn)行結(jié)果

    2024年02月09日
    瀏覽(18)
  • Direct3D 12——模板——平面鏡效果

    Direct3D 12——模板——平面鏡效果

    1.將實(shí)物照常渲染到后臺(tái)緩沖區(qū)內(nèi)(不包括鏡子)。注意,此步驟不修改模 板緩沖區(qū)。 2.清理模板緩沖區(qū),將其整體置零。 將實(shí)物都繪制到后臺(tái)緩沖區(qū)中,并將模板緩沖區(qū)清理為0 (用淺灰色來表示)。 繪制在模板緩沖區(qū)中的黑色輪廊線條反映的是:后臺(tái)緩沖區(qū)與模板緩沖區(qū)

    2023年04月21日
    瀏覽(18)
  • Direct3D 12——燈光——光照模型的概述

    Direct3D 12——燈光——光照模型的概述

    將之前所述的所有光照內(nèi)容都結(jié)合起來,即表面反射的光量相當(dāng)于環(huán)境反射光、漫反射光以及 鏡面反射光的光量總和。 1.環(huán)境光 C a :模擬經(jīng)表面反射的間接光量。 2.漫反射光 C d :對(duì)進(jìn)入介質(zhì)內(nèi)部,又經(jīng)過表面下吸收而最終散射岀表面的光進(jìn)行模擬。由于對(duì)表 面下的散射光

    2023年04月16日
    瀏覽(21)
  • Direct3D 12——計(jì)算著色器——計(jì)算著色器概念

    Direct3D 12——計(jì)算著色器——計(jì)算著色器概念

    計(jì)算著色器雖然是一種可編程的著色器,但Direct3D并沒有將它直接歸為渲染流水線中的一部分。雖然如此,但位于流水線之外的計(jì)算著色器卻可以讀寫GPU資源。從本質(zhì)上來說,計(jì)算著 色器能夠使我們?cè)L問GPU來實(shí)現(xiàn)數(shù)據(jù)并行算法,而不必渲染出任何圖形。由于計(jì)算著色器是Dir

    2024年02月03日
    瀏覽(20)
  • Character Animation With Direct3D 讀書筆記

    2D動(dòng)畫:循環(huán)播放多張圖片 3D動(dòng)畫: 骨骼動(dòng)畫、變形動(dòng)畫 Win32 應(yīng)用程序 Application類:處理主程序循環(huán),圖形設(shè)備的初始化 Init:加載資源并創(chuàng)建圖形設(shè)備 Update:更新游戲世界,移動(dòng)對(duì)象,更新物理引擎 Render:渲染所有對(duì)象,并將結(jié)果呈現(xiàn)給屏幕 Quit Cleanup DirectX 渲染循環(huán):

    2024年02月12日
    瀏覽(20)
  • 三維引擎基礎(chǔ)概述(Direct3D、OpenGL、UE、U3D、threejs等)

    三維引擎基礎(chǔ)概述(Direct3D、OpenGL、UE、U3D、threejs等)

    一般而言,三維引擎是在三維底層圖形技術(shù)的基礎(chǔ)上,封裝硬件操作與三維圖形算法,形成普遍意義上的三維交互引擎,提供給開發(fā)者一個(gè)簡(jiǎn)單易用、功能豐富的三維圖形環(huán)境,在此基礎(chǔ)上進(jìn)行虛擬現(xiàn)實(shí)、三維交互、可視化管理平臺(tái)二次開發(fā)等,極大提高開發(fā)效率。 【底層圖

    2024年02月11日
    瀏覽(31)
  • web3D三維引擎(Direct3D、OpenGL、UE、U3D、threejs)基礎(chǔ)掃盲

    web3D三維引擎(Direct3D、OpenGL、UE、U3D、threejs)基礎(chǔ)掃盲

    三維引擎是指用于創(chuàng)建和渲染三維圖形的軟件框架。它們通常提供了圖形處理、物理模擬、光照、碰撞檢測(cè)等功能,幫助開發(fā)者構(gòu)建逼真的三維場(chǎng)景和交互體驗(yàn)。在這里,我將為您詳細(xì)介紹一些常見的三維引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微軟

    2024年02月11日
    瀏覽(21)
  • DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    查看龍書時(shí)發(fā)現(xiàn), 第四章介紹預(yù)備知識(shí)的代碼不太利于學(xué)習(xí) 。因?yàn)樗幌袷荓earnOpenGL那樣從頭開始一步一步教你敲代碼,導(dǎo)致你沒有一種整體感。 如果你把它當(dāng)作某一塊的代碼進(jìn)行學(xué)習(xí),你跟著敲會(huì)發(fā)現(xiàn),總有幾個(gè)變量是沒有定義的。這是因?yàn)闀系拇a都是把框架里的某

    2024年02月08日
    瀏覽(28)
  • 在direct3D中,透明度處理和D2D1_ALPHA_MODE_PREMULTIPLIED含義?

    D2D1_ALPHA_MODE_PREMULTIPLIED 是 Direct2D 中定義的一種 Alpha 模式,用于描述像素顏色值和其 Alpha 通道(透明度)之間的關(guān)系。 在非預(yù)乘 Alpha (Straight or Unpremultiplied Alpha) 圖像中,每個(gè)顏色分量(紅、綠、藍(lán))是獨(dú)立于 Alpha 值的。而在預(yù)乘 Alpha 圖像中,每個(gè)顏色分量已經(jīng)被其對(duì)應(yīng)的

    2024年01月25日
    瀏覽(26)
  • 缺失d3d9.dll怎么辦,修復(fù)d3d9.dll的方法分享

    缺失d3d9.dll怎么辦,修復(fù)d3d9.dll的方法分享

    當(dāng)您在 Windows 操作系統(tǒng)中啟動(dòng)某些游戲或應(yīng)用程序時(shí),您可能會(huì)遇到“缺失d3d9.dll”的錯(cuò)誤提示。這個(gè)問題通常是由于系統(tǒng)缺失了DirectX 9的組件庫(kù),從而導(dǎo)致該dll文件無法正常加載。但是,您不需要擔(dān)心,因?yàn)檫@個(gè)問題可以很容易地解決。本文將介紹一些最常見的解決方案,

    2024年02月10日
    瀏覽(90)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包