LPDIRECT3DTEXTURE9 und Gdiplus::Graphics
-
Hallo,
ich versuche ein mit Gdiplus geladenes Bild auf eine DirectX Texture zu bringen.
Das ist mein Code:int filenameSize; LPWSTR filenameWSTR; // File filenameSize = MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, m_strFileName.c_str(), -1, 0, 0); filenameWSTR = (LPWSTR) malloc(filenameSize * sizeof(LPWSTR)); MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED, m_strFileName.c_str(), -1, filenameWSTR, filenameSize); Bitmap imageBitmap(filenameWSTR); free (filenameWSTR); int width = imageBitmap.GetWidth(); int height = imageBitmap.GetHeight(); SallyAPI::GUI::CPicture* newPic = new SallyAPI::GUI::CPicture(); newPic->CreateEmptyPixelFormat(width, height, imageBitmap.GetPixelFormat()); IDirect3DSurface9* surface; SallyAPI::Util::CTexture* texture = newPic->GetTexture(); LPDIRECT3DTEXTURE9 d3dTexture = texture->GetTexture(); d3dTexture->GetSurfaceLevel(0, &surface); HDC hdc; surface->GetDC(&hdc); Graphics graphics(hdc); graphics.DrawImage(&imageBitmap, 0, 0, width, height); //dc2bitmap(hdc, width, height, "C:\\test.bmp"); surface->ReleaseDC(hdc); surface->Release();
Das ganze läuft so weit auf einigen Test ohne Probleme. Aber auf anderen Test PC's wird das Bild nicht richtig auf die Texture gebracht.
z.B.
Orginal:
http://www.der-knob.de/temp/P1030595.jpgAusgabe des HDCs in eine datei (dc2bitmap Methode):
http://www.der-knob.de/temp/test.jpgDer schwarze Rand ist in der LPDIRECT3DTEXTURE9 nicht vorhanden (glaube ich). Beim Rendern wird das Bild auf die volle breite gestreckt... Aber wenn ich das HDC des Surfaces in ein BMP Bild schreibe kommt das Bild mit einem schwarzen Rand rechts raus.
Hier ist noch die wie ich die "leere" Texture erstelle:
bool CTexture::CreateEmpty(int iWidth, int iHeight, int id, D3DFORMAT d3dFormat) { CleanUp(); // Try to Load the Texture if(D3DXCreateTexture(SallyAPI::Core::CGame::GetDevice(), iWidth, iHeight, 1, 0, d3dFormat, D3DPOOL_MANAGED, &m_Texture) != D3D_OK) { CleanUp(); return false; } m_iWidth = iWidth; m_iHeight = iHeight; m_iId = id; return true; }
Ach ja, das passiert nicht bei allen Bildern. Aber ich kann das ganze z.B. auf Bilder von bestimmten DigiCams zurückführen.
Hat jemand eine Idee?
-
ach ja, ich kann die Testrechner auf denen das Problem entsteht eingerenzen.
Alle haben eine Intel Grafikkarte (so ein OnBoard Teil)...
-
Versuch mal vor DrawImage die PageUnit auf Pixel zu setzen:
http://msdn.microsoft.com/en-us/library/ms535812(VS.85).aspx
-
Danke für den Tipp, hat aber leider nicht funktioniert...
-
Ok... das muss ich jetzt nicht verstehen...
Ich hole mir jetzt D3DSURFACE_DESC
D3DSURFACE_DESC pDesc;
d3dTexture->GetLevelDesc(0, &pDesc);und mache jetzt
graphics.DrawImage(&imageBitmap, 0, 0, pDesc.Width, pDesc.Height);Komisch ist nur das
width x height => 2560 x 1920
pDesc.Width x pDesc.Height => 2048 x 1920
Obwohl ich mir mit width und heigt die Textur erstelle...
Aber wie gesagt, nur auf bestimmten Systemen...Passt jetzt... Danke!
-
Ich würde jetzt mal Spekulieren und sagen das die Graka nicht mehr kann, ich weiß nciht genau was die OnBoards von intel können hab aber in neueren Systemen durchaus noch DX7 Karten gesehen, evtl ist bei der einfach bei 2048x2048 schluß, das würde sich auch decken mit deiner Aussage das es nur auf einigen Systemen passiert.
-
Ah ok... das würde es erklären...
Mh, ich glaub dann werde ich noch mal was ändern.
Ich hasse diese Intel Grafikkarten... die sind einfach nur eine Seuche!