<?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[In BMP-Datei schreiben]]></title><description><![CDATA[<p>Moin,<br />
ich hab da ein kleines Problem mit meinem Programm, das eine BMP Datei mit 640*480 Pixeln schreiben soll. Hier erstmal der Code:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;ctime&gt;
#include &lt;windows.h&gt;
using namespace std;

struct BMPHEADER
{
       SHORT id; //BMP-File ID &quot;BM&quot;
       DWORD size; //Größe der Datei
       DWORD res1; //reserviert
       DWORD res2;
       DWORD BMPdata; //Offset vom Programmanfang zu Bilddaten
};

struct INFHEADER
{
       DWORD biSize; //Strukturgröße von BMPHEADER
       DWORD biWidth;  //Breite des Bildes
       DWORD biHeigth; //Höhe des Bildes
       WORD biPlanes;  //&quot;Zeichenebenen&quot;
       WORD biBitCount; //Farbtiefe
       DWORD comp;      //Kompression
       DWORD SizeImage; //Größe der Bilddaten in Byte
       DWORD XPixelperMeter; //nicht notwendig (=0)
       DWORD YPixelperMeter; //ebenso
       DWORD ClrUsed;      //verwendete Farben 
       DWORD ClrImportant;  //wichtige Farben(0: alle Farben wichtig)
};

BMPHEADER bmpfheader = {19778,sizeof(BMPHEADER)+sizeof(INFHEADER)+3*(640*480),
                        0,0,sizeof(BMPHEADER)+sizeof(INFHEADER)};  //19778  
                        //bezeichnet &quot;BM&quot; Kennung, Offsetangabe so ok?
INFHEADER infhead = {sizeof(BMPHEADER),640,480,0,24,0,640*480*3,0,0,0,0};
char Array[640][480][3]; //640*480 Pixel, 3Byte pro Pixel

int main()
{
srand(time(0));
for(int i= 0; i&lt;100;i++)
  {
     for(int k=0;k&lt;100;k++)
       {
             for(int j=0;j&lt;3;j++)
             {
             Array[i][k][j] = rand()%256; //Fülle Pixel mit Zufallswerten
             }
       }
   }       
ofstream Bild(&quot;hallo.bmp&quot;, ios::out|ios::binary|ios::trunc);

Bild.write(reinterpret_cast&lt;char*&gt;(&amp;bmpfheader), sizeof(BMPHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(&amp;infhead), sizeof(INFHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(Array),3*(640*480));
Bild.close();
return 0; 
}
</code></pre>
<p>Ich hab mich hier vorerst auf 24-Bit-Farbtiefe beschränkt, da die eigentlichen Bilddateien direkt hinter dem INFHEADER folgen und keine Farbpalette benötigt wird. Der Code selbst lässt sich wunderbar kompilieren, nur die geschriebene BMP-Datei lässt sich nicht Öffnen(&quot;Error Opening this document&quot;). Ich bin der BMP-Datei auch schon mit dem Hexeditor zu Leibe gerückt, die &quot;BM&quot; Kennung am Anfang schreibt er jedenfalls ordentlich rein. Ich habe auch schon probiert mit #pragma pack(0) das Alignment auszuschalten, aber das hat auch nicht geholfen. Sieht vielleicht jemand, was ich falsch mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197223/in-bmp-datei-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 02:57:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197223.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Nov 2007 07:43:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to In BMP-Datei schreiben on Thu, 08 Nov 2007 07:43:59 GMT]]></title><description><![CDATA[<p>Moin,<br />
ich hab da ein kleines Problem mit meinem Programm, das eine BMP Datei mit 640*480 Pixeln schreiben soll. Hier erstmal der Code:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;ctime&gt;
#include &lt;windows.h&gt;
using namespace std;

struct BMPHEADER
{
       SHORT id; //BMP-File ID &quot;BM&quot;
       DWORD size; //Größe der Datei
       DWORD res1; //reserviert
       DWORD res2;
       DWORD BMPdata; //Offset vom Programmanfang zu Bilddaten
};

struct INFHEADER
{
       DWORD biSize; //Strukturgröße von BMPHEADER
       DWORD biWidth;  //Breite des Bildes
       DWORD biHeigth; //Höhe des Bildes
       WORD biPlanes;  //&quot;Zeichenebenen&quot;
       WORD biBitCount; //Farbtiefe
       DWORD comp;      //Kompression
       DWORD SizeImage; //Größe der Bilddaten in Byte
       DWORD XPixelperMeter; //nicht notwendig (=0)
       DWORD YPixelperMeter; //ebenso
       DWORD ClrUsed;      //verwendete Farben 
       DWORD ClrImportant;  //wichtige Farben(0: alle Farben wichtig)
};

BMPHEADER bmpfheader = {19778,sizeof(BMPHEADER)+sizeof(INFHEADER)+3*(640*480),
                        0,0,sizeof(BMPHEADER)+sizeof(INFHEADER)};  //19778  
                        //bezeichnet &quot;BM&quot; Kennung, Offsetangabe so ok?
INFHEADER infhead = {sizeof(BMPHEADER),640,480,0,24,0,640*480*3,0,0,0,0};
char Array[640][480][3]; //640*480 Pixel, 3Byte pro Pixel

int main()
{
srand(time(0));
for(int i= 0; i&lt;100;i++)
  {
     for(int k=0;k&lt;100;k++)
       {
             for(int j=0;j&lt;3;j++)
             {
             Array[i][k][j] = rand()%256; //Fülle Pixel mit Zufallswerten
             }
       }
   }       
ofstream Bild(&quot;hallo.bmp&quot;, ios::out|ios::binary|ios::trunc);

Bild.write(reinterpret_cast&lt;char*&gt;(&amp;bmpfheader), sizeof(BMPHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(&amp;infhead), sizeof(INFHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(Array),3*(640*480));
Bild.close();
return 0; 
}
</code></pre>
<p>Ich hab mich hier vorerst auf 24-Bit-Farbtiefe beschränkt, da die eigentlichen Bilddateien direkt hinter dem INFHEADER folgen und keine Farbpalette benötigt wird. Der Code selbst lässt sich wunderbar kompilieren, nur die geschriebene BMP-Datei lässt sich nicht Öffnen(&quot;Error Opening this document&quot;). Ich bin der BMP-Datei auch schon mit dem Hexeditor zu Leibe gerückt, die &quot;BM&quot; Kennung am Anfang schreibt er jedenfalls ordentlich rein. Ich habe auch schon probiert mit #pragma pack(0) das Alignment auszuschalten, aber das hat auch nicht geholfen. Sieht vielleicht jemand, was ich falsch mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399555</guid><dc:creator><![CDATA[Matzer]]></dc:creator><pubDate>Thu, 08 Nov 2007 07:43:59 GMT</pubDate></item><item><title><![CDATA[Reply to In BMP-Datei schreiben on Thu, 08 Nov 2007 07:54:12 GMT]]></title><description><![CDATA[<p>Matzer schrieb:</p>
<blockquote>
<p>Ich habe auch schon probiert mit #pragma pack(0) das Alignment auszuschalten, aber das hat auch nicht geholfen. Sieht vielleicht jemand, was ich falsch mache?</p>
</blockquote>
<p>pack(0) ist ja auch Quatsch. Mein Compiler sagt dazu:<br />
<strong>warning C4086: expected pragma parameter to be '1', '2', '4', '8', or '16'</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399559</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 08 Nov 2007 07:54:12 GMT</pubDate></item><item><title><![CDATA[Reply to In BMP-Datei schreiben on Thu, 08 Nov 2007 08:05:52 GMT]]></title><description><![CDATA[<p>Du hast den <a href="http://de.wikipedia.org/wiki/Windows_Bitmap#Dateikopf" rel="nofollow">Bitmap-Header</a> nicht wirklich korrekt zusammengesetzt:</p>
<p>Matzer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct BMPHEADER
{
       SHORT id; //BMP-File ID &quot;BM&quot;
       DWORD size; //Größe der Datei
       DWORD res1; //reserviert
       DWORD res2;
       DWORD BMPdata; //Offset vom Programmanfang zu Bilddaten
};
</code></pre>
</blockquote>
<p>Das DWORD res2 ist überflüssig - und zerstört in der Folge auch die Offset-Berechnungen.</p>
<blockquote>
<pre><code class="language-cpp">struct INFHEADER
{
       DWORD biSize; //Strukturgröße von BMPHEADER
       DWORD biWidth;  //Breite des Bildes
       DWORD biHeigth; //Höhe des Bildes
       WORD biPlanes;  //&quot;Zeichenebenen&quot;
       WORD biBitCount; //Farbtiefe
       DWORD comp;      //Kompression
       DWORD SizeImage; //Größe der Bilddaten in Byte
       DWORD XPixelperMeter; //nicht notwendig (=0)
       DWORD YPixelperMeter; //ebenso
       DWORD ClrUsed;      //verwendete Farben 
       DWORD ClrImportant;  //wichtige Farben(0: alle Farben wichtig)
};
</code></pre>
</blockquote>
<p>biWidth und biHeigth sind LONG-Werte (letzteres kann auch negativ werden), genauso die beiden PxielperMeter-Werte.</p>
<blockquote>
<pre><code class="language-cpp">BMPHEADER bmpfheader = {19778,sizeof(BMPHEADER)+sizeof(INFHEADER)+3*(640*480),
                        0,0,sizeof(BMPHEADER)+sizeof(INFHEADER)};  //19778  
                        //bezeichnet &quot;BM&quot; Kennung, Offsetangabe so ok?
</code></pre>
</blockquote>
<p>Abgesehen davon, daß eine 0 zu viel ist (siehe oben), sieht die Angabe gut aus.</p>
<blockquote>
<pre><code class="language-cpp">INFHEADER infhead = {sizeof(BMPHEADER),640,480,0,24,0,640*480*3,0,0,0,0};
</code></pre>
</blockquote>
<p>falscher Größenwert (du brauchst 'sizeof(INFHEADER)'), biPlanes sollte 1 sein - und für die Datengröße kannst du auch 0 einsetzen.</p>
<blockquote>
<pre><code class="language-cpp">char Array[640][480][3]; //640*480 Pixel, 3Byte pro Pixel
</code></pre>
</blockquote>
<p>Der Platz reicht zwar, aber ich bin mir jetzt nicht ganz sicher, ob die Anordnung zum Bitmap passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399561</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 08 Nov 2007 08:05:52 GMT</pubDate></item><item><title><![CDATA[Reply to In BMP-Datei schreiben on Thu, 08 Nov 2007 11:39:02 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Hinweise, hat wunderbar geklappt. Ich stell den (funktionierenden) Source hier nochmal rein, vielleicht kann es ja jemand gebrauchen:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;ctime&gt;
#include &lt;windows.h&gt;
using namespace std;

#pragma pack(1)
struct BMPHEADER
{
       SHORT id;
       DWORD size;
       DWORD res1;
       DWORD adress_BMP_data;
};

struct INFHEADER
{
       DWORD biSize;
       LONG biWidth;
       LONG biHeigth;
       WORD biPlanes;
       WORD biBitCount;
       DWORD comp;
       DWORD SizeImage;
       LONG XPixelperMeter;
       LONG YPixelperMeter;
       DWORD ClrUsed;
       DWORD ClrImportant;
};

BMPHEADER bmpfheader = {19778,sizeof(BMPHEADER)+sizeof(INFHEADER)+3*(640*480),
                        0,sizeof(BMPHEADER)+sizeof(INFHEADER) };
INFHEADER infhead = {sizeof(INFHEADER),640,480,1,24,0,640*480*3,0,0,0,0};
char Array[640][480][3];

int main()
{
srand(time(0));
for(int i= 0; i&lt;640;i++)
  {
     for(int k=0;k&lt;480;k++)
       {
             for(int j=0;j&lt;3;j++)
             {
             Array[i][k][j] = rand()%256;
             }
       }
   }    

ofstream Bild(&quot;hallo.bmp&quot;, ios::out|ios::binary|ios::trunc);

Bild.write(reinterpret_cast&lt;char*&gt;(&amp;bmpfheader), sizeof(BMPHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(&amp;infhead), sizeof(INFHEADER));
Bild.write(reinterpret_cast&lt;char*&gt;(Array),3*(640*480));
Bild.close();
return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1399673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399673</guid><dc:creator><![CDATA[Matzer]]></dc:creator><pubDate>Thu, 08 Nov 2007 11:39:02 GMT</pubDate></item><item><title><![CDATA[Reply to In BMP-Datei schreiben on Thu, 08 Nov 2007 14:31:02 GMT]]></title><description><![CDATA[<p>Wow, so eine schönes Bild hatte ich ja noch nie...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399789</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 08 Nov 2007 14:31:02 GMT</pubDate></item></channel></rss>