Pointerarray verschiedene Datentypen zuweisen

HolgerX

Mitglied
Ich möchte in C++ einem Speicherbereich, auf den ein Pointer zeigt verschiedene Werte zuweisen.
Ich habe eine Klasse CDIB geschrieben, die eine DIB verwaltet.
Dabei will ich einem Pointer auf unsigned char die Daten des BITMAPINFOHEADER zuweisen. Danach will ich dahinter die Daten von RGBQUAD und dann die Daten der Bitmap schreiben.

Das ganze soll dann in etwa so aussehen:
Code:
unsigned char *pDib;
pDib = new unsigned char [Größe der DIB];
BITMAPINFOHEADER *BIH;
//BITMAPINFOHEADER mit Daten füllen
...
RGBQUAD *pPalette;
// Palette auf 2 Farben einstellen
...
*pDib = *BIH;
*(pDib + sizeof(BITMAPINFOHEADER) = *pPalette;
*(pDib + sizeof(BITMAPINFOHEADER) + sizeof(pPalette) = *Datenbits der Bitmap;
Wie kann man das realisieren?
Ich habe bereits versucht mittels for-Schleifen alle Bytes von BIH, pPalette und der Datenbits durchlaufen zu lassen und dann einzeln diese zuzuweisen. Aber das klappt auch nicht.
:(
 
Ich verstehe dein Problem nicht ganz. Möchtest du wissen, wie du auf die einzelnen Bytes in deinem char-Array zugreifst? Oder wie du auf einzelne Eigenschaften des in dem Array versteckten BITMAPINFOHEADER zugreifst? Bitte erklär mir das genauer, eventuell mit deinem Beispielcode (for-Schleife).
 
In einer .bmp Datei sind doch BITMAPFILEHEADER,BITMAPINFOHEADER; RGBQUAD, die Bilddaten hintereinander im Block gespeichert.

Wenn ich aus einer Datei diese Daten einlese, kann ich sie auch wunderbar im Block abspeichern. - Aber jetzt stelle ich mir Konstrukte selbst her, die ich nicht einfach aus einer Datei in einem Stück auslesen kann.
Wie kann ich die BITMAPINFOHEADER, RGBQUAD und die Bilddaten, die ich jeweils seperat vorliegen habe, in einem Block hintereinander speichern?

Meine for-Schleife:
Code:
for (int bih = 0; bih < sizeof(BITMAPINFOHEADER); bih ++)
{
    *(pDib + bih) = (unsigned char*) BIH[bih];
}
for(int x = 0; x < sizeof(RGBQUAD); x++)
{
   *(pDib + sizeof(BITMAPINFOHEADER)) = (unsigned char*) RGBQUAD[x];
}

long counter = 0;
for(int zeile  = yPosition; zeile < yPosition + height; zeile ++)
{
	for (int spalte = xPosition; 
			spalte < xPosition +width +fillBytes; spalte ++)
	{
			
		// Den Zeiger auf die DIB Datenbits setzen
		m_pDibBits[counter] = image.GetMonochromeBit(spalte, zeile);
		counter ++;
	}

}
//dabei zeigt m_pDibBits auf  *(pDib +sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)
 
Zuletzt bearbeitet:
Erstmal benötigst du einen Zielbereich, der gross genug ist, Header, Palette und eigentliche Bilddaten aufzunehmen, danach kannst du die Daten aus den drei Quellen einkopieren, etwa so:
Code:
//  habe hier bereits pQuellHeader, pQuellPalette, pQuellPixel;

unsigned int iGroesseDesHeaders     = sizeof( BITMAPINFOHEADER  );  //  konstant
unsigned int iGroesseDerPalette       = ?;  // herausfinden
unsigned int iGroesseDerPixeldaten = ?;  // herausfinden
pDib = new unsigned char[ iGroesseDesHeaders+ iGroesseDerPalette + iGroesseDerPixeldaten ];

unsigned int j = 0;
for (j  = 0; j < iGroesseDesHeaders ; ++j )
{
    *(pDib + j) = (unsigned char*) pQuellHeader[j];
}
for (j  = 0; j < iGroesseDerPalette       ; ++j )
{
    *(pDib + iGroesseDesHeaders  + j) = (unsigned char*) pQuellPalette[j];
}
for (j  = 0; j < iGroesseDerPixeldaten  ; ++j )
{
    *(pDib + iGroesseDesHeaders  +  iGroesseDesHeaders + j) = (unsigned char*) pQuellPixel[j];
}

Hinweis: Ich weiss nicht, ob die drei Sektionen eventuell auf gerade bzw. durch vier teilbare Offsets gesetzt werden müssen.

Ich hoffe, das hilft dir weiter.
 

Neue Beiträge

Zurück