2011-12-06 12 views
1

GDI +を使用して直前にロードしたイメージをDirect Xにロードしたいと思います。出来ますか?私はディスクにイメージを保存してから使用してそれを読み込むことができることを知っている:D3DXLoadSurfaceFromMemory + GDI +:イメージを表示するには?

D3DXLoadSurfaceFromFile 

をしかし、私はメモリにロードされたGDI +画像を

D3DXLoadSurfaceFromMemory 

を使用したいと思います。 GDI +画像はGdiPlus ::画像タイプです。

私は、Visual C++ 2010

に事前に感謝を使用しています。

更新:コードの上記PICE私はGDI +画像にBASE64(Base64EncodedImage)で符号化された画像を変換せ

using namespace Gdiplus; 
std::string decodedImage = base64_decode(Base64EncodedImage); 
DWORD imageSize = decodedImage.length(); 
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, imageSize); 
LPVOID pImage = ::GlobalLock(hMem); 
memcpy(pImage, decodedImage.c_str(), imageSize); 
IStream* pStream = NULL; 
::CreateStreamOnHGlobal(hMem, FALSE, &pStream); 
Image image(pStream); 

。これまでのところ、私はバイト配列(バッファ)として画像を変換するので、良い次:サイドノートとして

int stride = 4 * ((image.GetWidth() + 3)/4); 
    size_t safeSize = 
    stride * image.GetHeight() * 4 + sizeof(BITMAPINFOHEADER) + 
    sizeof(BITMAPFILEHEADER) + 256 * sizeof(RGBQUAD); 
HGLOBAL mem = GlobalAlloc(GHND, safeSize); 
LARGE_INTEGER seekPos = {0}; 
ULARGE_INTEGER imageSizeEx; 
HRESULT hr = pStream->Seek(seekPos, STREAM_SEEK_CUR, &imageSizeEx); 
BYTE* buffer = new BYTE[imageSizeEx.LowPart]; 
hr = pStream->Seek(seekPos, STREAM_SEEK_SET, 0);  
hr = pStream->Read(buffer, imageSizeEx.LowPart, 0); 

、私は、損失なしでPNG画像としてディスクにバイト配列を保存し、することができますD3DXLoadSurfaceFromFileを使用してロードします。

次の私が作成し、表面をロード:

hr = d3ddevex->CreateOffscreenPlainSurface(image.GetWidth(), image.GetHeight(), D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &surf, NULL); 

RECT srcRect; 
srcRect.left = 0; 
srcRect.top = 0; 
srcRect.bottom = image.GetWidth(); 
srcRect.right = image.GetHeight(); 

hr = D3DXLoadSurfaceFromMemory(surf, NULL, NULL, buffer, D3DFMT_X8R8G8B8,image.GetWidth(), NULL, &srcRect,D3DX_FILTER_NONE,0); 

これは作業ですが、それはテストパターンであれば画像のような(すべてではどこでもすべてではありませんが、無秩序、着色画素「読める」の画像を表示されますアーケードゲームから)。

答えて

0

DirectXテクスチャが変更なしでGDI +からデータを受信できるように、適切なDirectXテクスチャ形式(たとえばDXGI_FORMAT_R32G32B32A32_UINT)を指定する必要があります。 ID3D11DeviceContext :: CopyResource()を使用してデータをコピーするか、使用しているDirectXのどのバージョンでも同等のデータをコピーできます。 画像を描画するには、クワッドを構成する幾何学的な形状(三角形)を設定し、これをパイプラインに渡す必要があります(詳細はGoogleの「フルスクリーンクワッド」を参照)。

+0

あなたのアンカーのおかげで申し訳ありませんが、私が探しているものではないテクスチャとして適用されます。これまでのところ、私はGDI + ImageをBYTE *配列に変換することができました。 'D3DXLoadSurfaceFromMemory(サーフィン、NULL、NULL、バッファー、D3DFMT_X8R8G8B8、image.GetWidth()、NULL、&srcRect、D3DX_FILTER_NONE、0);'バッファー 'イメージデータを含むバッファー(pngウェブからストリーミングされたファイル)。しかし、私は次のエラーが発生しています:**アクセス違反0x00ed0000 **で、私はそこに停泊しています。 –

+0

イメージを読み込んで画面に表示することができました。しかし、すべてのピクセルが乱雑ですが、そうではありません。私はそれがD3DFMT_X8R8G8B8パラメータかもしれないと思いますか?おそらく –

+0

。トラブルシューティングのためにDirectXのデバッグ出力を使用していますか? DirectXコントロールパネルで有効にすることができます。出力は、VisualStudioコンソールウィンドウに出力されます。これは通常、非常に有益です(あなたはそれを過ぎているように聞こえますが)。 – axon

0

SrcPichtパラメータのsi img.GetWidth()* 4、それはバイト単位です:

hr = D3DXLoadSurfaceFromMemory(
    spSurface, 
    NULL, 
    &rectDes, 
    bd.Scan0, 
    D3DFMT_X8R8G8B8, 
    image.GetWidth()*4, //@ here is different only 
    NULL, 
    &rectSrc, 
    D3DX_FILTER_NONE,0); 

私がテストし、それが働きました。

関連する問題