2013-05-11 3 views
1

В настоящее время я пытаюсь скопировать gdi + bitmap в текстуру directx.копирование gdi + bitmap в текстуру directx

Я использую DirectX9 из-за ограничений Win XP. Ниже мой код попытка:

#include <gdiplus.h> 
#pragma comment(lib, "Gdiplus.lib") 

void attemptCopy() 
{ 
static IDirect3DTexture9* mTexture; 
Gdiplus::GdiplusStartupInput m_gdiplusStartupInput; 
ULONG_PTR m_gdiplusToken; 

Gdiplus::GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL); 

HDC hdc; 
PAINTSTRUCT ps; 
UINT mWidth = 1024; 
UINT mHeight = 1024; 

//hdc = BeginPaint(g_engine->getWindowHandle(), &ps); 
using namespace Gdiplus; 

Bitmap bitmap(1024, 1024, PixelFormat32bppARGB); 
Graphics graphics(&bitmap); 

Color transparent = Color(0, 255, 255, 255); 
graphics.Clear(transparent); 

graphics.SetSmoothingMode(SmoothingModeAntiAlias); 
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias); 

FontFamily fontFamily(L"Arial"); 
StringFormat strformat; 
wchar_t pszbuf[] = L"Text Designer"; 

GraphicsPath path; 
path.AddString(pszbuf, wcslen(pszbuf), &fontFamily, 
    FontStyleRegular, 48, Gdiplus::Point(10,10), &strformat); 
Pen pen(Color(234,137,6), 6); 
graphics.DrawPath(&pen, &path); 
SolidBrush brush(Color(128,0,255)); 
graphics.FillPath(&brush, &path); 

//save bitmap for comparison 
CLSID pngClsid; 
GetEncoderClsid(L"image/png", &pngClsid); 
bitmap.Save(L"test_bit.png", &pngClsid, NULL); 

D3DXCreateTexture(
    g_engine->getDevice(), 
    mWidth, 
    mHeight, 
    1, 
    0, 
    //D3DFMT_A8L8, 
    D3DFMT_A8R8G8B8, 
    D3DPOOL_MANAGED, 
    &mTexture); 

D3DLOCKED_RECT lockedRect; 
mTexture->LockRect(0, &lockedRect,0, 0); 

unsigned char* TexData = (unsigned char*)lockedRect.pBits; 

memcpy(TexData, &bitmap, sizeof(bitmap)); 

mTexture->UnlockRect(0); 

D3DXSaveTextureToFileA("test.png",D3DXIFF_PNG, mTexture, 0); 

//EndPaint(g_engine->getWindowHandle(), &ps); 
Gdiplus::GdiplusShutdown(m_gdiplusToken); 
} 

В основном я пытаюсь попытаться тетсром из gdiplus растрового изображения с Directx текстуры. Результаты следующие:

  1. test.png (сохраненный DirectX текстуры) http://i1280.photobucket.com/albums/a500/daegon123/test_zps09f12c7f.png

  2. test_bit.png (сохраненный битовый массив для сравнения) http://i1280.photobucket.com/albums/a500/daegon123/test_bit_zpse8be6cd7.png

test_bit.png возвращается правильное изображение, в то время как текстура directx остается пустой. Следовательно, кажется, что я просто неправильно делаю процедуру копирования.

Любые идеи о том, как я могу это сделать?

ответ

3

Проблема здесь:

memcpy(TexData, &bitmap, sizeof(bitmap)); // this is not correct 

Вы копируя Bitmap класс себя, но вы должны копировать пиксели, это упаковка. Для получения доступа к базовым данным вам необходимо указать lock the bitmap pixels.

Что-то вроде этого:

BitmapData bitmapData; 
bitmap.LockBits(&Rect(0,0,mWidth,mHeight), ImageLockModeRead, 
    PixelFormat32bppARGB, &bitmapData); 
unsigned char *pSourcePixels = (unsigned char*)bitmapData.Scan0; 

Затем вы должны скопировать пикселей построчно в случае большого шага размеры различны:

// get destination pointer and copy pixels 
unsigned char *pDestPixels = (unsigned char*)lockedRect.pBits; 
for (int y = 0; y < mHeight; ++y) 
{ 
    // copy a row 
    memcpy(pDestPixels, pSourcePixels, mWidth * 4); // 4 bytes per pixel 

    // advance row pointers 
    pSourcePixels += bitmapData.Stride; 
    pDestPixels += lockedRect.Pitch; 
} 

Обратите внимание, что вам нужно, чтобы убедиться, что лежащий в основе пиксельные форматы эквивалентны. Я предположил, что оба они одинаковы, но вам может потребоваться внести поправки в вышеуказанный код, если вам необходимо изменить порядок, например BGRA до ARGB и т. Д.

+0

Спасибо, отлично работает! – dk123

Смежные вопросы