|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 09.05.2006, 18:12 Titel: BYTE Feld mit einer Bitmap füllen |
|
|
Hi
Ich muss eine Bitmap in ein Byte-Block hineinvergewaltigen. Klingt komisch, ist aber so
Naja, Spaß beiseite, also ich habe eine Struktur, in die ich eine Bitmap zerlege und einlese. Gefüllt sieht das so aus:
CPP: | typedef struct tagBMP
{
BITMAPFILEHEADER bmfh;
BITMAPINFO* pbmi;
BYTE* pBits;
in_Sizes memberSizes;
} BMP; |
Die ersten 3 Member sind die Sachen, die in der Bitmap stehen. Den letzen Member habe ich hinzugefügt; er beinhaltet Informationen über die Größen der BITMAPINFO und den Pixeldaten, ist aber für das Problem net wichtig. Diese drei Member muss ich in ein Byte-Block quetschen, um dasselbe zu erhalten, wie wenn ich die Bitmap direkt in ein Byte-Block einlese, was ich ja so erhalten würde: CPP: | void readBitmapInByteBlock (std::string filename)
{
std::ifstream file(filename.c_str());
BYTE* bitmap = (BYTE*)malloc(getSizeFrom(filename)); // getSizeFrom ist eine Funktion von mir, die die Dateigröße in Byte angibt; btw: sry für malloc(), das musste sein
file.read(reinterpret_cast<char*>(bitmap), getSizeFrom(filename));
// uswusf, so sieht das in Pseudo aus |
Also, so lese ich eine Bitmap in einen Byte-Block ein. Was aber, wenn ich die Bitmap schon geladen habe? Ich hab mir sowas überlegt: CPP: | //bmp ist von der Struktur BMP, die ich oben gepostet hab
BYTE* byteBmp = (BYTE*)malloc(bmp.bmfh.bfSize); // auch hier sry ;)
byteBmp = reinterpret_cast<BYTE*>(bmp.bmfh); // so, als erstes kommt der header rein. |
jo, nur jetzt bin ich mir net mehr sicher. Da das extrem gefährlich ist, will ich nix falsch machen, deswegen frag ich hier.
Ich müsste nun an den Bereich, wo BITMAPFILEHEADER aufhört, die BITMAPINFO aus bmp schreiben. In etwa sowas, auch wenn ich mir da sehr unsicher bin, das soll nur pseudo sein:
CPP: | BYTE* ptr = byteBmp + sizeof(BITMAPFILEHEADER);
ptr = reinterpret_cast<BYTE*>(bmp.pbmi); |
Also: wie kann ich das machen?
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.05.2006, 18:51 Titel: |
|
|
Extrem gefährlich isses nicht, das schlimsmte was passierne kann, ist das du ne Exception bekommst... (IMHO)
Wieso mischst du C-Casts mit C++-Casts (letzes Code Stück)?
Wie wärs mit memcpy() ? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 09.05.2006, 18:59 Titel: |
|
|
Jonathan_Klein hat Folgendes geschrieben: | Extrem gefährlich isses nicht, das schlimsmte was passierne kann, ist das du ne Exception bekommst... (IMHO) |
na gut, dann probier ichs einfach mal. Gefährlich ist nur, wenn man zuweit kopiert; was da alles überschrieben werden kann... naja, exceptions sind net das schlimmste
Jonathan_Klein hat Folgendes geschrieben: | Wieso mischst du C-Casts mit C++-Casts (letzes Code Stück)? |
das (BYTE*)malloc... ist aus alten Zeiten, rauskopiert ausm Petzold. Ich hab das noch net gecodet, deswegen hab ich mir keine Mühe gemacht, das zu ändern. Nimms mir net übel Falls es dich beruhigt: sobald das umsetze kommt das weg
Jonathan_Klein hat Folgendes geschrieben: | Wie wärs mit memcpy() ? |
hmm, memcpy, naja. ok, ma gucken
Ansonsten: Welche Möglichkeit gibts sonst noch, die ganzen Daten in dem BYTE-Block zu sammeln?
Gruß DXer |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 09.05.2006, 19:04 Titel: |
|
|
DirectXer hat Folgendes geschrieben: |
Ansonsten: Welche Möglichkeit gibts sonst noch, die ganzen Daten in dem BYTE-Block zu sammeln? |
Du willst ienen Speicherbereich in einen andern kopieren, ja?
Entweder machst du ne schleife, mit BYTE Zeigern und kopierst Byte für Byte, oder du nimmst memcpy, wobei das definitiv eine einfache und gute Lösung ist. Mir selbst wären da keine nachteile bekannt. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.05.2006, 12:16 Titel: |
|
|
'union' könnte auch eine ziemlich elegante Lösung für dein Problem darstellen, weiß aber nicht, ob eventuell etwas gegen die Verwendung (allgemein oder konkret in deinen Fall) spricht.
Btw.: 'BYTE' ist doch nur ein typedef für char? Wieso verwendest du nicht direkt char, das würde den hässlichen 'reinterpret_cast' sparen?
Edit: Müsste dann in etwa so ausschauen:
CPP: | union bitmap
{
BMP* bmp;
BYTE* bmp_bytes;
};
...
foo.bmp->... // hier kannst du die Struktur mit deinem Kram vollpacken
foo.bmp_bytes[...] // so kannst du auf die einzelnen Bytes als Array zugreifen |
Edit 2: Waah, kleinen Flüchtigkeitsfehler korrigiert.
Zuletzt bearbeitet von GreveN am 10.05.2006, 15:45, insgesamt 4-mal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 10.05.2006, 14:58 Titel: |
|
|
GreveN hat Folgendes geschrieben: |
Btw.: 'BYTE' ist doch nur ein typedef für char? Wieso verwendest du nicht direkt char, das würde den hässlichen 'reinterpret_cast' sparen? |
Das stimtm nicht, es ist ein typedef für unsigned char!
Ich ahtte mal ein Problem das sich allein dadurch lösen ließ, das ich BYTE statt char verwendet habe, daher ist das schon wichtig. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.05.2006, 15:00 Titel: |
|
|
GreveN hat Folgendes geschrieben: | 'union' könnte auch eine ziemlich elegante Lösung für dein Problem darstellen, weiß aber nicht, ob eventuell etwas gegen die Verwendung (allgemein oder konkret in deinen Fall) spricht. | Naja, das wäre mir zu unsicher, wer weiß ob der über die Grenzen einer BYTE-Größe hinausgeht usw. ich probier das erstmal so
GreveN hat Folgendes geschrieben: | Btw.: 'BYTE' ist doch nur ein typedef für char? Wieso verwendest du nicht direkt char, das würde den hässlichen 'reinterpret_cast' sparen? |
CPP: | typedef unsigned char BYTE | aus WinGDI.h, sonst hast du recht, aber das Stück verwende ich ja net, war nur ein Beispiel. und das Erhalten zeigt deutlicher den Sinn, da auf dem indirketen Weg der Cast ja auch bleiben muss
Gruß DXer, danke für die Antworten |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.05.2006, 15:04 Titel: |
|
|
Gut, du hast Recht, habe eben noch mal in der MSDN nachgeschaut.
Dennoch könnte man ebenso 'unsigned char' statt 'BYTE' verwenden.
Edit:
DirectXer hat Folgendes geschrieben: | GreveN hat Folgendes geschrieben: | 'union' könnte auch eine ziemlich elegante Lösung für dein Problem darstellen, weiß aber nicht, ob eventuell etwas gegen die Verwendung (allgemein oder konkret in deinen Fall) spricht. | Naja, das wäre mir zu unsicher, wer weiß ob der über die Grenzen einer BYTE-Größe hinausgeht usw. ich probier das erstmal so |
Versteh ich nicht ganz...
Hast du dieses Hineineditierte in meinem Post oben bemerkt (zugegeben: war grad sehr ungünstiges Timing)? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.05.2006, 17:14 Titel: |
|
|
GreveN hat Folgendes geschrieben: |
Hast du dieses Hineineditierte in meinem Post oben bemerkt (zugegeben: war grad sehr ungünstiges Timing)? |
ne hab ich net^^ ok, verstanden. Aber, meine Struktur BMP enthält ja noch mehr sachen, die ich net in dem BYTE Block haben will. Wenn vllt so? CPP: | union bmp_pack
{
struct
{
BITMAPFILEHEADER bmfh;
BITMAPINFO* pbmi;
BYTE* pBits;
};
BYTE* bmp_Bytes;
}; |
Gruß DXer |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.05.2006, 17:59 Titel: |
|
|
Jopp, mit namenlosen Strukturen geht das immer schön, allerdings wirds da ein Problem geben, da sich in dem Falle ja die Member der Struktur und ein Zeiger den selben Speicherplatz teilen, d.h. wenn du die Strukturelemente änderst, änderst du den Zeiger aber nicht was an dessen Adresse steht. Ist aber kein Problem, das erste Element muss einfach auch ein Zeiger sein und beim Zugriff dann einfach generell dereferenzieren...
Allerdings weiß ich grad nicht, ob es möglich ist die Adresse der namenlosen Struktur in der Union zu hinterlegen, ich glaube eher nicht. Musst du also einfach eine Struktur BMP oder so, wie du sie schon hattest per Zeiger speichern... Natürlich dann nicht vergessen dem Zeiger auch was zuzuweisen, sonst krachts...
Hoffe hab' mich jetzt nicht gar zu verdreht ausgedrückt, ansonsten einfach nochmal nachfragen... geht eigentlich ganz simpel und kann man ziemlich nette Dinge anstellen mit den Teilen...
Btw.: Kann man z.B. auch schön zum transformieren von Werten bzw. "Casten" verwenden.
Bsp.:
CPP: | union color
{
struct
{
unsigned char a, r, g, b;
};
unsigned long d3dcolor;
}; |
|
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.05.2006, 18:29 Titel: |
|
|
nagut, hab ich eigentlich verstanden; aber ich frag lieber doch nochmal nach: Also, meinst du z.B. so?
CPP: | struct inBMP
{
BITMAPFILEHEADER bmhf;
BITMAPINFO* pbmi;
BYTE* pBits;
} inBMP;
union packedBMP
{
inBMP* pBMP;
BYTE* pByteBMP;
};
// irgendwo im Code
packedBMP bmp;
// einlesen in eine BMP-Variable (BMP bitmap;); dann kopieren:
bmp.pBMP = new inBMP;
bmp.pBMP->bmfh = bitmap.bmfh;
bmp.pBMP->pbmi = bitmap.pbmi;
bmp.pBMP->pBits = bitmap.pBits;
// so, jetzt sind alle werte drin | sind die jetzt auch in dem BYTE-Zeiger? Also, für bmp.pBMP hab ich mit new platz reserviert; muss ich also für den BYTE-Zeiger in der union kein Platz mehr mit new oder malloc oder so reservieren, ne? denn die stehen ja an der selben adresse... OK? Vllt ist das auch wichtig: Die Größe von pbmi ist variabel, wie auch natürlich von pBits, deswegen sind das ja Zeiger. In dem Byte-Block muss aber kein Zeiger drin sein sondern direkt alle Sachen da; sollte ich dann vllt für pbmi und pBits auch platz reservieren und dann mit memcpy arbeiten?
Gruß DXer |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 10.05.2006, 18:53 Titel: |
|
|
Ach Gottchen, du kannst Fragen stellen, ist ja richtig Denksport hier.
Hm... ich glaube die Sache mit den Zeigern macht das Ganze jetzt etwas dusslig und unsinnig, bzw. komplexer als es sein muss. Aber im Prinzip ist es richtig, wie es dasteht.
Mir fällt grade keine Lösung ein, wie man das Problem mit den Zeigern in der Bmp-Struktur umgehen kann, da natürlich die Zeiger als Bytes gehandhabt werden und nicht die Werte, die dahinter stehen... Unter diesen Umständen wäre es sicher am sinnvollsten wirklich einfach 'std::memcpy' zu verwenden, sorry für die Verwirrung die ich gestiftet hab'...
Naja, ich denke die Erfahrung war's auf jeden Fall wert. Höhö. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.05.2006, 19:21 Titel: |
|
|
GreveN hat Folgendes geschrieben: | Ach Gottchen, du kannst Fragen stellen, ist ja richtig Denksport hier.
Hm... ich glaube die Sache mit den Zeigern macht das Ganze jetzt etwas dusslig und unsinnig, bzw. komplexer als es sein muss. Aber im Prinzip ist es richtig, wie es dasteht.
Mir fällt grade keine Lösung ein, wie man das Problem mit den Zeigern in der Bmp-Struktur umgehen kann, da natürlich die Zeiger als Bytes gehandhabt werden und nicht die Werte, die dahinter stehen... Unter diesen Umständen wäre es sicher am sinnvollsten wirklich einfach 'std::memcpy' zu verwenden, sorry für die Verwirrung die ich gestiftet hab'...
Naja, ich denke die Erfahrung war's auf jeden Fall wert. Höhö. |
gut, dann danke, dass du mich "aufgeklärt" hast Ich mach das jetz so mit memcpy und gut is
Gruß DXer (ist ja mein PC, den ich missbrauche, nicht ich ) |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|