JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8ae6cc3140aea413850688ce50d8039dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

BYTE Feld mit einer Bitmap füllen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 09.05.2006, 19:12    Titel: BYTE Feld mit einer Bitmap füllen Antworten mit Zitat

Hi

Ich muss eine Bitmap in ein Byte-Block hineinvergewaltigen. Klingt komisch, ist aber so Rolling Eyes

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? Confused

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 09.05.2006, 19:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 09.05.2006, 19:59    Titel: Antworten mit Zitat

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 Twisted Evil

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 Rolling Eyes Falls es dich beruhigt: sobald das umsetze kommt das weg Razz

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 09.05.2006, 20:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 13:16    Titel: Antworten mit Zitat

'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, 16:45, insgesamt 4-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 15:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 16:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 16:04    Titel: Antworten mit Zitat

Gut, du hast Recht, habe eben noch mal in der MSDN nachgeschaut. Razz
Dennoch könnte man ebenso 'unsigned char' statt 'BYTE' verwenden. Razz

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 18:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 18:59    Titel: Antworten mit Zitat

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

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

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 19:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 19:53    Titel: Antworten mit Zitat

Ach Gottchen, du kannst Fragen stellen, ist ja richtig Denksport hier. Very Happy
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'... Wink

Naja, ich denke die Erfahrung war's auf jeden Fall wert. Höhö. Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 10.05.2006, 20:21    Titel: Antworten mit Zitat

GreveN hat Folgendes geschrieben:
Ach Gottchen, du kannst Fragen stellen, ist ja richtig Denksport hier. Very Happy
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'... Wink

Naja, ich denke die Erfahrung war's auf jeden Fall wert. Höhö. Cool

gut, dann danke, dass du mich "aufgeklärt" hast Wink Ich mach das jetz so mit memcpy und gut is Twisted Evil Razz

Gruß DXer (ist ja mein PC, den ich missbrauche, nicht ich Twisted Evil )
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum