• R/O
  • HTTP
  • SSH
  • HTTPS

CsWin10Desktop3: Commit

Visual C# 7.0, Windows10 Desktop App


Commit MetaInfo

Revisiond7bf24b739f284c943850d2cb36cb4c5331f225f (tree)
Time2017-09-17 18:28:10
Authorくまかみ工房 <kumakamikoubou@gmai...>
Commiterくまかみ工房

Log Message

画面キャプチャクラスを追加。

Change Summary

Incremental Difference

--- a/FDK/FDK.csproj
+++ b/FDK/FDK.csproj
@@ -142,6 +142,7 @@
142142 <Compile Include="メディア\文字列画像.cs" />
143143 <Compile Include="メディア\画像.cs" />
144144 <Compile Include="メディア\画像フォント.cs" />
145+ <Compile Include="メディア\画面キャプチャ.cs" />
145146 <Compile Include="メディア\矩形リスト.cs" />
146147 <Compile Include="メディア\縁取りTextRenderer.cs" />
147148 <Compile Include="入力\IInputDevice.cs" />
--- /dev/null
+++ b/FDK/メディア/画面キャプチャ.cs
@@ -0,0 +1,79 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Diagnostics;
4+using System.Linq;
5+using SharpDX;
6+using SharpDX.Direct2D1;
7+using SharpDX.Direct3D11;
8+using SharpDX.DXGI;
9+using FDK.メディア;
10+
11+namespace FDK.メディア
12+{
13+ public class 画面キャプチャ
14+ {
15+ private 画面キャプチャ()
16+ {
17+ }
18+
19+ /// <summary>
20+ /// 現在のバックバッファの内容を Bitmap に複写して返す。
21+ /// すべての描画が終わったあと、Present() する前に呼び出すこと。
22+ /// </summary>
23+ /// <returns>Bitmap。使用後は解放すること。</returns>
24+ public static Bitmap 取得する( グラフィックデバイス gd )
25+ {
26+ Debug.Assert( null != gd.D3DDevice, "D3DDevice が取得されていません。" );
27+
28+ // バックバッファの情報を取得する。
29+ var backBufferDesc = new Texture2DDescription();
30+ using( var backBuffer = gd.SwapChain.GetBackBuffer<Texture2D>( 0 ) )
31+ {
32+ backBufferDesc = backBuffer.Description;
33+ }
34+
35+ // CPUがアクセス可能な Texture2D バッファをGPU上に作成する。
36+ var captureTexture = new Texture2D(
37+ gd.D3DDevice,
38+ new Texture2DDescription() {
39+ ArraySize = 1,
40+ BindFlags = BindFlags.None,
41+ CpuAccessFlags = CpuAccessFlags.Read, // CPUからアクセスできる。
42+ Format = backBufferDesc.Format,
43+ Height = backBufferDesc.Height,
44+ Width = backBufferDesc.Width,
45+ MipLevels = 1,
46+ OptionFlags = ResourceOptionFlags.None,
47+ SampleDescription = new SampleDescription( 1, 0 ),
48+ Usage = ResourceUsage.Staging, // GPU から CPU への copy ができる。
49+ } );
50+
51+ // RenderTarget から Texture2D バッファに、GPU上で画像データをコピーする。
52+ using( var resource = gd.D3DRenderTargetView.Resource )
53+ {
54+ gd.D3DDevice.ImmediateContext.CopyResource( resource, captureTexture );
55+ }
56+
57+ var bitmap = (Bitmap) null;
58+
59+ using( var dxgiSurface = captureTexture.QueryInterface<Surface>() )
60+ {
61+ var dataRect = dxgiSurface.Map( SharpDX.DXGI.MapFlags.Read, out DataStream dataStream );
62+
63+ bitmap = new Bitmap(
64+ gd.D2DDeviceContext,
65+ new Size2( captureTexture.Description.Width, captureTexture.Description.Height ),
66+ new DataPointer( dataStream.DataPointer, (int) dataStream.Length ),
67+ dataRect.Pitch,
68+ new BitmapProperties(
69+ new PixelFormat( Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Ignore ),
70+ gd.D2DDeviceContext.DotsPerInch.Width,
71+ gd.D2DDeviceContext.DotsPerInch.Width ) );
72+
73+ dxgiSurface.Unmap();
74+ }
75+
76+ return bitmap;
77+ }
78+ }
79+}
Show on old repository browser