Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » DirectX » [DirectDraw] BMP Farben vertauscht

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.03.2009, 12:10 Uhr
~PeterPanzki
Gast


Hallo,

ich arbeite grade an einer DirectDraw Klasse. Mein problem ist, dass wenn ich eine BMP in ein Surface laden will, die z.B. geld ist, wir diese mir in pink oder so ausgegeben. Ich habe zwar eine Palette ins Primary Surface geladen, aber irgendwas ist da wohl noch falsch.

Außerdem werden mir BMPs die nicht in der größe 1280 * 960 sind vollkommen schief ausgegeben.

Bsp:

XXXXOOOO ==> OOOOXXXX
XXXXOOOO ==> OOOXXXXO
XXXXOOOO ==> OOXXXXOO
XXXXOOOO ==> OXXXXOOO
XXXXOOOO ==> XXXXOOOO


Wäre schön, wenn mir vielleicht jemand helfen könnte.

Hier der Code:


C++:

HANDLE DirectDraw::BMPDateiOeffnen(const char* Datei_Name)
{
       HANDLE hDatei;
      
       hDatei = CreateFile(Datei_Name, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
      
       if(hDatei != INVALID_HANDLE_VALUE)
                 return hDatei;
      
       return INVALID_HANDLE_VALUE;
}


bool DirectDraw::BMPInSurface( const char* BMPDatei, LPDIRECTDRAWSURFACE7 lpDDSurf, bool Palette_laden)
{
       LPBYTE           lpbyBild;
       HANDLE           hDatei;
       BITMAPFILEHEADER BMPFileHead;
       BITMAPINFOHEADER BMPFileInfo;
       RGBQUAD          Palette[256];
       DWORD            dwLeseSpeicher;
       DDSURFACEDESC2   ddsd;
       LPSTR            lpZielRAM;
       LPSTR            lpQuellRAM;
       int              DDS_Breite;
       int              DDS_Hoehe;
      
       //Surface (in die das BMP soll) verriegeln
       ZeroMemory(&ddsd, sizeof(ddsd));
       ddsd.dwSize = sizeof(ddsd);
      
       lpDDSurf->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
       DDS_Breite = ddsd.dwWidth;
       DDS_Hoehe  = ddsd.dwHeight;
      
       // Speicher für die Bild-dateie bereitstellen
       if( !(lpbyBild = (LPBYTE)malloc(DDS_Breite*DDS_Hoehe)))
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 1", "XXX", MB_OK);
           return false;
       }
      
       // BMP-Datei öffnen
       hDatei = BMPDateiOeffnen(BMPDatei);
       if(hDatei == INVALID_HANDLE_VALUE)
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 2", "XXX", MB_OK);
           return false;
       }
      
       // BMP-Header einlesen
       if( !ReadFile(hDatei, &BMPFileHead, sizeof(BMPFileHead), &dwLeseSpeicher, NULL))
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 3", "XXX", MB_OK);
           CloseHandle(hDatei);
           return false;
       }
      
       //BMP-Info-Header einlesen
       if( !ReadFile(hDatei, &BMPFileInfo, sizeof(BMPFileInfo), &dwLeseSpeicher, NULL))
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 4", "XXX", MB_OK);
           CloseHandle(hDatei);
           return false;
       }
      
       // Hat die BMP das richtige Format
       if((BMPFileInfo.biWidth != DDS_Breite) || (BMPFileInfo.biHeight != DDS_Hoehe) || (BMPFileInfo.biBitCount != 8))
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 5", "XXX", MB_OK);
           CloseHandle(hDatei);
           return false;
       }
      
       // Lies und speicher die Palette
       if( !ReadFile(hDatei, Palette, sizeof(Palette), &dwLeseSpeicher, NULL))
       {
           MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 6", "XXX", MB_OK);
           CloseHandle(hDatei);
           return false;
       }
      
       // Lies die eigentlichen Bilddaten des BMP
       if(!ReadFile(hDatei, lpbyBild, DDS_Breite*DDS_Hoehe, &dwLeseSpeicher, NULL));
       {
           CloseHandle(hDatei);
       }
      
       // Schließe die Datei wieder
       CloseHandle(hDatei);
      
       // Setze die Startadressen der Pointer
       lpZielRAM = (LPSTR)ddsd.lpSurface;
       lpQuellRAM = (LPSTR)(&lpbyBild[(DDS_Hoehe - 1) * DDS_Breite]);
      
       // Kopiere die Bilddatei aus der Variablen 'lpbyBild'
       // zeilenweise in den Vram der Surface
      
       for(int j = 0; j < DDS_Hoehe; j++)
       {
               memcpy(lpZielRAM, lpQuellRAM, DDS_Breite);
               lpZielRAM += ddsd.lPitch;
               lpQuellRAM -= DDS_Breite;
       }
      
       // Entriegeln der Surface nach dem Schreiben der Daten
       lpDDSurf->Unlock(NULL);
      
       // Speicher freigeben
       if(lpbyBild);
              free(lpbyBild);
      
       // Wenn Palette übernommen werden soll, dann DDraw Palette aus der
       // BMP Palette erzeugen und für Primary Surface setzen
       if(Palette_laden)
       {
              PALETTEENTRY pe[256];
              HRESULT      ddrval;
              
              ZeroMemory(pe, MAX_FARBEN * sizeof(PALETTEENTRY));
              
              for(int i = 0; i < MAX_FARBEN; i++)
              {
                      pe[i].peRed = Palette[i].rgbRed;
                      pe[i].peGreen = Palette[i].rgbGreen;
                      pe[i].peBlue = Palette[i].rgbBlue;
                      pe[i].peFlags = PC_NOCOLLAPSE;
              }
              
              ddrval = lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, pe, &lpDDPal, NULL);
              if(ddrval != DD_OK)
              {
                        MessageBox(hwnd, "Bitmap Fehler: CreatePalette", "XXX", MB_OK);
                        return false;
              }
              
              ddrval = lpDDSPrimary->SetPalette(lpDDPal);
              if(ddrval != DD_OK)
              {
                        MessageBox(hwnd, "Bitmap Fehler: SetPalette", "XXX", MB_OK);
                        return false;
              }
       }
       return true;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.03.2009, 18:19 Uhr
~PeterPanzki
Gast


Also ich habe jezt grade gemerkt, bei welcher Funktion es zu hängen scheint:


C++:
                                        *
                                        *
                                        *

       // Lies die eigentlichen Bilddaten des BMP
       if(!ReadFile(hDatei, lpbyBild, DDS_Breite*DDS_Hoehe, &dwLeseSpeicher, NULL));
       {
           // Hier Habe ich einfach mal folgendes eingefügt und es wurde auch sofort beim  
           // Ausführen des Programms für jedes bild dass ich eingefügt hatte ausgegeben.
          MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 7", "XXX", MB_OK);

           CloseHandle(hDatei);
       }

                                        *
                                        *
                                        *



Sry wegen Doppelpost (verklickt).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.03.2009, 18:22 Uhr
~PeterPanzki
Gast


Kann mir denn keiner helfen???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ DirectX ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: