이전에 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);
이 작동하지만, 이미지가 전혀 사방 아니지만 "읽기"이미지를 모든 무질서 컬러 픽셀을 나타납니다
다음은 내가 만들고 표면을로드 아케이드 게임에서).
안녕하세요, 감사합니다. 귀하의 anwser에 대한 감사하지만 텍스처가 내가 찾고있는 것이 아닙니다. 지금까지 GDI + Image를 BYTE * 배열로 변환 할 수있었습니다. D3DXLoadSurfaceFromMemory (서핑, NULL, NULL, 버퍼, D3DFMT_X8R8G8B8, image.GetWidth(), NULL, & srcRect, D3DX_FILTER_NONE, 0);'중인 버퍼 '이미지 데이터를 포함하는 버퍼 (png 웹에서 스트리밍 된 파일). 하지만 다음과 같은 오류가 발생합니다 : ** 액세스 위반 0x00ed0000 **, 그래서 거기에 붙어 있어요. –
이미지를로드하여 화면에 표시 할 수있었습니다. 그러나 모든 픽셀은 지저분 해 보인다. D3DFMT_X8R8G8B8 매개 변수가 될 것 같아요? 아마 –
. 문제 해결을 돕기 위해 DirectX의 디버그 출력을 사용하고 있습니까? DirectX 제어판에서 활성화 할 수 있습니다. 출력은 VisualStudio 콘솔 창에 출력됩니다. 일반적으로 매우 유익합니다 (지나친 것처럼 들리지만). – axon