<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++ Monochrom-Bitmap erstellen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>seit heute bastle ich ein wenig an einem Programm in C++, welches mir eine 2 farbige Bitmap erstellen<br />
soll. Dabei soll quasi die Bitmap als ASCII Code in eine leere Datei geschrieben werden.<br />
Wie eine Bitmap aus Hexcode aufgebaut ist, weiß ich schon, bzw. habe ich verstanden...<br />
Nun wollte ich das ganze mal in C++ umsetzen und stoße dabei jedoch schon auf den ein oder anderen Fehler.<br />
Hier mal meine Struktur für den BitmapFileHeader:</p>
<pre><code>typedef struct bmpFileHeader
{
	UINT16 bmType;
	UINT32 fileLength;
	UINT16 reserved1;
	UINT16 reserved2;
	UINT32 bmOffset;
};
</code></pre>
<p>Hier dann die Initialisierung in einer Funktion:</p>
<pre><code>bmphex2file(string filename, unsigned int width, unsigned int height, DWORD pxdata)
{
    ofstream bmpfile;
    bmpfile.open(filename,  ios::binary | ios::out);
    //[...]anderer Kram
    bmpFileHeader BFHEADER = { ('B' | 'M' &lt;&lt; 8), 62 + height * 4, 0, 0, 62 };
    //Header in datei schreiben:
    bmpfile &lt;&lt; (char *)&amp;BFHEADER;
    //hier folgen dann der BMP Info Header, die Farbtabelle usw...
}
</code></pre>
<p>Nun habe ich das Problem, dass wenn ich mir das ganze folgendermaßen ausgeben lassen, die<br />
Ausgabe so aussieht:</p>
<p>BMÌÌR</p>
<p>Das BM ist jedenfalls mal richtig, dannach, müsste aber direkt das R folgen (weil 82 Bytes für die<br />
Gesamtgröße der Datei in der ASCII Tabelle einem R entsprechen und direkt nach der Kennung BM folgen).<br />
Die beiden &quot;ÌÌ&quot; sind dabei jedoch sehr eigenartig. Im HexEdit betrachtet stehen diese als<br />
&quot;cc&quot; da. Ist das so eine Art Placeholder für nicht vollständig &quot;ausgefüllte&quot; Variablen? Eigentlich<br />
ist UINT16 ja schon genau die richtige Größe...!? Und das nächste ist, dass nach dem R ja noch ASCII Code<br />
für die Reservierten Bytes und die Zahl der Bytes vor Pixel Data folgen müssten...</p>
<p>Kann mir jemand weiterhelfen oder sagen was ich falsch mache? Danke für alle Antworten</p>
<p>Gruß</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329593/c-monochrom-bitmap-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 07:57:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329593.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Nov 2014 17:26:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Monochrom-Bitmap erstellen on Sat, 17 Jan 2015 12:02:58 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>seit heute bastle ich ein wenig an einem Programm in C++, welches mir eine 2 farbige Bitmap erstellen<br />
soll. Dabei soll quasi die Bitmap als ASCII Code in eine leere Datei geschrieben werden.<br />
Wie eine Bitmap aus Hexcode aufgebaut ist, weiß ich schon, bzw. habe ich verstanden...<br />
Nun wollte ich das ganze mal in C++ umsetzen und stoße dabei jedoch schon auf den ein oder anderen Fehler.<br />
Hier mal meine Struktur für den BitmapFileHeader:</p>
<pre><code>typedef struct bmpFileHeader
{
	UINT16 bmType;
	UINT32 fileLength;
	UINT16 reserved1;
	UINT16 reserved2;
	UINT32 bmOffset;
};
</code></pre>
<p>Hier dann die Initialisierung in einer Funktion:</p>
<pre><code>bmphex2file(string filename, unsigned int width, unsigned int height, DWORD pxdata)
{
    ofstream bmpfile;
    bmpfile.open(filename,  ios::binary | ios::out);
    //[...]anderer Kram
    bmpFileHeader BFHEADER = { ('B' | 'M' &lt;&lt; 8), 62 + height * 4, 0, 0, 62 };
    //Header in datei schreiben:
    bmpfile &lt;&lt; (char *)&amp;BFHEADER;
    //hier folgen dann der BMP Info Header, die Farbtabelle usw...
}
</code></pre>
<p>Nun habe ich das Problem, dass wenn ich mir das ganze folgendermaßen ausgeben lassen, die<br />
Ausgabe so aussieht:</p>
<p>BMÌÌR</p>
<p>Das BM ist jedenfalls mal richtig, dannach, müsste aber direkt das R folgen (weil 82 Bytes für die<br />
Gesamtgröße der Datei in der ASCII Tabelle einem R entsprechen und direkt nach der Kennung BM folgen).<br />
Die beiden &quot;ÌÌ&quot; sind dabei jedoch sehr eigenartig. Im HexEdit betrachtet stehen diese als<br />
&quot;cc&quot; da. Ist das so eine Art Placeholder für nicht vollständig &quot;ausgefüllte&quot; Variablen? Eigentlich<br />
ist UINT16 ja schon genau die richtige Größe...!? Und das nächste ist, dass nach dem R ja noch ASCII Code<br />
für die Reservierten Bytes und die Zahl der Bytes vor Pixel Data folgen müssten...</p>
<p>Kann mir jemand weiterhelfen oder sagen was ich falsch mache? Danke für alle Antworten</p>
<p>Gruß</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430217</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Sat, 17 Jan 2015 12:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Monochrom-Bitmap erstellen on Sat, 29 Nov 2014 20:25:48 GMT]]></title><description><![CDATA[<p>ostream::operator&lt;&lt; für char* ist spezialisiert für Zeichenketten im C-Stil. Das heißt, es wird so lange geschrieben, bis das erste Zeichen mit dem Wert 0 auftaucht. Woher sonst sollte die Funktion wissen, wo das Ende ist? Bei dir sollte die erste 0 nach dem R kommen und tatsächlich hört dort das geschriebene auch auf. Benutz ostream::write, um Daten unformatiert zu schreiben.<br />
Die &quot;Ì&quot; sind wahrscheinlich Padding. Wenn man ein struct/class definiert, ist zwar garantiert, dass die Attribute alle in der Reihenfolge im Speicher liegen, wie man sie angegeben hat, aber es ist nicht garantiert, dass sie lückenlos im Speicher liegen. Es ist nämlich viel effizienter zum Rechnen, wenn das Programm die Felder an gewissen Grenzen im Speicher ausrichten kann (meistens Adressen, die genau durch 4 oder 8 teilbar sind). Wenn du garantieren möchtest, dass die structs lückenlos im Speicher liegen, musst du mal in der Anleitung deines Compilers gucken, ob es ein Feature gibt, dies zu erzwingen. Fast alle Compiler können das. Oft heißt es &quot;pragma pack&quot; oder ähnlich. Jedenfalls solltest du mit &quot;pragma pack name_deines_compilers&quot; etwas bei Google finden.<br />
Alternativ kannst du es auch einfach sein lassen, die Daten alle in einem Rutsch schreiben zu wollen und sie stattdessen einfach einzeln hintereinander ausgeben. Dann ist es egal, ob noch irgendwas zwischen den Daten steht, schließlich greifst du einzeln auf die jeweiligen Felder zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430266</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 29 Nov 2014 20:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Monochrom-Bitmap erstellen on Sun, 30 Nov 2014 18:30:42 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>vielen Dank für deine ausführliche Antwort. Ich habe jetzt sowohl #pragma pack PACKED eingetragen<br />
als auch file.write(content, sizeof(content)) verwendet, es scheint jedenfalls zu funktionieren.<br />
Danke nochmal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> !</p>
<p>Viele Grüße</p>
<p>Cyax</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2430391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2430391</guid><dc:creator><![CDATA[Cyax]]></dc:creator><pubDate>Sun, 30 Nov 2014 18:30:42 GMT</pubDate></item></channel></rss>