2011-12-06 5 views
1

이전에 Direct X에 GDI +를 사용하여로드 한 이미지를로드하고 싶습니다. 그것은 가능한가? 나는 디스크에 이미지를 저장하고 사용하여로드 할 수 있다는 사실을 알고 :D3DXLoadSurfaceFromMemory + GDI + : 이미지를 표시하는 방법?

D3DXLoadSurfaceFromFile 

을하지만 메모리에로드 GDI + 이미지

D3DXLoadSurfaceFromMemory 

를 사용하고 싶습니다; GDI + 이미지는 GdiPlus :: 이미지 유형입니다.

저는 Visual C++ 2010을 사용하고 있습니다.

미리 감사드립니다.

업데이트 : 코드의 상기 파이스 날은 GDI + 이미지베이스 64 (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

안녕하세요, 감사합니다. 귀하의 anwser에 대한 감사하지만 텍스처가 내가 찾고있는 것이 아닙니다. 지금까지 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 매개 변수 실리콘 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); 

, 그것은했다.

관련 문제