Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

1

24.06.2012, 22:51

Werte aus int-Array in Graustufen-Bitmap speichern

Guten Abend,

ich programmiere momentan einen Mapgenerator (quadratische Maps), der ein 2-dimensionales Array (besser gesagt ein Vektor, der Vektoren speichert, die Tiles speichern), mit Zufallswerten zwischen 0 und 255 füllt.

Nun möchte ich aus diesen Werten eine Graustufen-Bitmap erstellen.

Gibt es dazu irgendwelche vorgefertigten Funktionen?

Habe mal ein wenig im Internet gestöbert, aber egtl. nur die Möglichkeit gefunden, selbst eine Datei zu erstellen und diese nach dem Bitmap-Format zu füllen.
Damit komme ich direkt zur zweiten Frage, denn dazu möchte ich am liebsten die virtuellen Dateien der TriBase-Engine nutzen. Wie kann ich die Werte erst in einen Speicherbereich verfrachten, um sie dann in die Bitmap zu packen?

Danke im Voraus

Nim
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

25.06.2012, 00:02

Zu 1: Es gibt vorgefertigte Funktionen. Diese sind je nach genutzter Sprache und genutzten Libraries unterschiedlich. Aber da Bitmaps sehr einfach aufgebaut sind, neigt man meist zum selbst machen. Von welcher Sprache reden wir denn eigentlich?

Zu 2: Indem du aus der vector<vector> Konstruktion ein 1D array/vector machst. Das erscheint im ersten Moment ggf. seltsam ist aber wesentlich effektiver als ein std::vector<std::vector<T> > Konstrukt. Man kann es sich quasi wie ein Schachbrett vorstellen: man kann ein bestimmtes Element entweder durch Zeile und Spalte genau benennen oder man nummeriert alle Felder eindeutig durch und nennt nur die Nummer. Typischer Weise wird dabei folgender Ansatz verwendet: index = x + y * felder_in_einer_zeile. Dieses "mapping" von 2D auf 1D ist nicht unüblich und in vielen Fällen wesentlich performanter als ein 2D Ansatz (wie std::vector<std::vector <T> >). Außerdem können so die nun aneinandergereihten Informationen direkt in einer 1 byte Bitmap gespeichert werden. So reduziert sich das Speichern als Bitmap auf das Öffnen einer neuen Datei mit bmp Endung, Schreiben eines entsprechenden Headers und dem schreiben des 1D arrays in die Datei und voila hat man eine fertige Bitmap.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Nimelrian

Alter Hase

  • »Nimelrian« ist der Autor dieses Themas

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

25.06.2012, 10:11

Tut mir Leid, ganz vergessen, es handelt sich um C++. Der Ansatz, das ganze auf 1D zu mappen erscheint mir logisch, danke dafür. Das letzte Problem wäre dann die Struktur der Bitmap, zu normalen habe ich da eine Menge gefunden, aber nicht zu Graustufen-Bitmaps. Kann mir da noch jemand helfen?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

25.06.2012, 11:12

Wie die entsprechenden structs in C++ aussehen kann man hier gut sehen: http://tipsandtricks.runicsoft.com/Cpp/BitmapTutorial.html (findet man so auch in den windows headern)
Ansonsten kann man über die einzelnen Attribute hier viel finden: http://de.wikipedia.org/wiki/Windows_Bitmap
Im Prinzip brauchst du biBitCount=8, aber dann wird eine Farbtabelle gefordert. Du kannst entweder dein 1 Byte array Element für Element in ein 24bit oder 32bit Farbpixel umwandeln, oder du schreibst halt einfach eine entsprechende Farbtabelle. Das ganze wird also quasi zu

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
BITMAPFILEHEADER bmpheader;
BITMAPINFOHEADER bmpinfo;
//hier bitte die korrekten Werte für header und info setzen; u.a. biBitCount=8
file.write((char*)&bmpheader,sizeof(bmpheader));
file.write((char*)&bmpinfo,sizeof(bmpinfo));
for(unsigned int counter = 0; counter < 256;counter++) // 2^8 mögliche farben => farbtabelle als 32 bit farben (BGR0 format)
{
   unsigned int color = (counter << 24) | (counter << 16) | (counter << 8);//graufarbe mit B=counter, G=counter, R=counter
   file.write((char*)&color,sizeof(color);
}
file.write((char*)imgdata,imgdata_size);

Wenn einem egal ist, welche Farbe am Ende angezeigt wird kann man auch direkt etwas in Richtung
"for(unsigned int counter = 0; counter < 256;counter++) file.write((char*)&counter,sizeof(counter);" nutzen, wobei ggf noch ein Byteshift notwendig sein könnte (bin ich mir gerade nicht so sicher, ob man sonst nicht in den "0" Teil von BGR0 schreiben würde).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige