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.jpg

    Ausgabe des HDCs in eine datei (dc2bitmap Methode):
    http://www.der-knob.de/temp/test.jpg

    Der 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!


Anmelden zum Antworten