<?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[Bitmap lesen und schreiben]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte eine Bitmap Datei einlesen, diese dann verändern und wieder speichern. Ich habe auch schon 3 oder 4 Beispiele gefunden, die sich entweder erst garnich kompilieren lassen oder nichts vernünftiges tun.</p>
<p>Das große Problem ist eigentlich das Einlesen. Dazu verwende ich 2 Strukturen</p>
<pre><code class="language-cpp">struct BITMAPFILEHEADER {
    unsigned short bfType;
    unsigned long bfSize;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned long bfOffBits;
    };

    struct BITMAPINFOHEADER {
    unsigned long biSize;
    unsigned long biWidth;
    unsigned long biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long biCompression;
    unsigned long biSizeImage;
    unsigned long biXPelsPerMeter;
    unsigned long biYPelsPerMeter;
    unsigned long biClrUsed;
    unsigned long biClrImportant;
    };
</code></pre>
<p>Mit</p>
<pre><code class="language-cpp">fp = fopen(filename, &quot;rb&quot;)
</code></pre>
<p>öffne ich die Datei zum binären lesen und mit</p>
<pre><code class="language-cpp">fp = fopen(filename, &quot;wb&quot;)
</code></pre>
<p>eine andere Datei zum binären schreiben.</p>
<p>Mit</p>
<pre><code class="language-cpp">fread(&amp;FileHeader, sizeof(FileHeader), 1, fp)
fread(&amp;InfoHeader, sizeof(InfoHeader), 1, fp)
</code></pre>
<p>lese ich dann das Bild ein.</p>
<p>Wenn ich aber dann mit</p>
<pre><code class="language-cpp">fwrite(&amp;FileHeader, sizeof(FileHeader), 1, fp)
</code></pre>
<p>den Dateiheader in eine andere Datei übertrage, kommt nur das &quot;MB&quot; am Anfang an. Alles andere sieht eher zufällig aus, obwohl ich es vorher auf 0 gesetzt habe.</p>
<p>Ich hoffe, jemand hat nen Tip</p>
<p>Gruß<br />
jabaa</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286084/bitmap-lesen-und-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 00:55:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286084.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 May 2011 12:41:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 12:41:11 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich möchte eine Bitmap Datei einlesen, diese dann verändern und wieder speichern. Ich habe auch schon 3 oder 4 Beispiele gefunden, die sich entweder erst garnich kompilieren lassen oder nichts vernünftiges tun.</p>
<p>Das große Problem ist eigentlich das Einlesen. Dazu verwende ich 2 Strukturen</p>
<pre><code class="language-cpp">struct BITMAPFILEHEADER {
    unsigned short bfType;
    unsigned long bfSize;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned long bfOffBits;
    };

    struct BITMAPINFOHEADER {
    unsigned long biSize;
    unsigned long biWidth;
    unsigned long biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long biCompression;
    unsigned long biSizeImage;
    unsigned long biXPelsPerMeter;
    unsigned long biYPelsPerMeter;
    unsigned long biClrUsed;
    unsigned long biClrImportant;
    };
</code></pre>
<p>Mit</p>
<pre><code class="language-cpp">fp = fopen(filename, &quot;rb&quot;)
</code></pre>
<p>öffne ich die Datei zum binären lesen und mit</p>
<pre><code class="language-cpp">fp = fopen(filename, &quot;wb&quot;)
</code></pre>
<p>eine andere Datei zum binären schreiben.</p>
<p>Mit</p>
<pre><code class="language-cpp">fread(&amp;FileHeader, sizeof(FileHeader), 1, fp)
fread(&amp;InfoHeader, sizeof(InfoHeader), 1, fp)
</code></pre>
<p>lese ich dann das Bild ein.</p>
<p>Wenn ich aber dann mit</p>
<pre><code class="language-cpp">fwrite(&amp;FileHeader, sizeof(FileHeader), 1, fp)
</code></pre>
<p>den Dateiheader in eine andere Datei übertrage, kommt nur das &quot;MB&quot; am Anfang an. Alles andere sieht eher zufällig aus, obwohl ich es vorher auf 0 gesetzt habe.</p>
<p>Ich hoffe, jemand hat nen Tip</p>
<p>Gruß<br />
jabaa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057740</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Tue, 03 May 2011 12:41:11 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 12:48:32 GMT]]></title><description><![CDATA[<p>Wie wäre es wenn du statt zweimal <code>fp</code> für verschiedene Dateien, <code>fpRead</code> und <code>fpWrite</code> nimmst? So holst du dir 2 Handels auf Files die dann zT gelesen und zT geschrieben werden .. das da murks bei rumkommt ist nicht verwunderlich <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="😉"
    /> Falls du das natürlich alles in der richtigen Reihenfolge machst, dann brauchen mer mehr Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Ich nehme mal einfach an das du die Datei auf dem selben Rechner erstellst und es daher nichts mit Endianess zu tun haben kann ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057744</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Tue, 03 May 2011 12:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 12:51:46 GMT]]></title><description><![CDATA[<p>Ja ne sorry, aber ich hab das eben so ausm Quelltext kopiert. Im ganzen gibts ne Methode</p>
<pre><code class="language-cpp">void Bitmap::LoadBitmap(const char *filename){
FILE             *fp;
...}
</code></pre>
<p>zum einlesen und eine Methode</p>
<pre><code class="language-cpp">void Bitmap::SaveBitmap(const char *filename){
FILE             *fp;
...}
</code></pre>
<p>zum schreiben. Somit hat das eine fp nen anderen Gültigkeitsbereich als das andere fp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057749</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Tue, 03 May 2011 12:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 13:15:05 GMT]]></title><description><![CDATA[<p>Hier ein minimal Beispiel:<br />
Bitmap.hpp</p>
<pre><code class="language-cpp">#ifndef BITMAP_H
#define BITMAP_H

typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned long LONG;

#include &quot;fstream&quot;
class Bitmap
{
 public:

	 void LoadBitmap(const char *Filename);
	 void SaveBitmap(const char *Filename);

	 void *bits;

	 //BITMAPFILEHEADER
	 typedef struct
	 {
	 WORD bfType;
	 DWORD bfSize;
	 DWORD bfReserved;
	 DWORD bfOffBits;
	 }BITMAPFILEHEADER;

	 //BITMAPINFOHEADER
	 typedef struct
	 {
	 DWORD biSize;
	 LONG biWidth;
	 LONG biHeight;
	 WORD biPlanes;
	 WORD biBitCount;
	 DWORD biCompression;
	 DWORD biSizeImage;
	 LONG biXPelsPerMeter;
	 LONG biYPelsPerMeter;
	 DWORD biClrUsed;
	 DWORD biClrImportant;
	 }BITMAPINFOHEADER;

	 BITMAPFILEHEADER FileHeader;
	 typedef struct
	 {
	 DWORD biSize;
	 LONG biWidth;
	 LONG biHeight;
	 WORD biPlanes;
	 WORD biBitCount;
	 DWORD biCompression;
	 DWORD biSizeImage;
	 LONG biXPelsPerMeter;
	 LONG biYPelsPerMeter;
	 DWORD biClrUsed;
	 DWORD biClrImportant;
	 }BITMAPINFOHEADER;

	 BITMAPFILEHEADER FileHeader;
	 BITMAPINFOHEADER InfoHeader;
};

#endif // BITMAP_H
</code></pre>
<p>Bitmap.cpp</p>
<pre><code class="language-cpp">#include &quot;Bitmap.hpp&quot;
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;

void Bitmap::LoadBitmap(const char *filename)    
{
    FILE             *fp;          
    int              bitsize;      
    int              infosize;     

    if ((fp = fopen(filename, &quot;rb&quot;)) == NULL)
        return;

    if (fread(&amp;FileHeader, sizeof(FileHeader), 1, fp) &lt; 1)
    {
	fclose(fp);
        return;
    }

    if (FileHeader.bfType != 'MB')
    {
        fclose(fp);
        return;
    }

    infosize = FileHeader.bfOffBits - sizeof(FileHeader);

    infosize = 40;
    if (fread(&amp;InfoHeader, infosize, 1,fp) &lt; infosize)
    {
        fclose(fp);
        return;
    }

    if ((bitsize = InfoHeader.biSize) == 0)
        bitsize = (InfoHeader.biWidth *
                   InfoHeader.biBitCount + 7) / 8 *
  	           abs(InfoHeader.biHeight);

    if ((bits = malloc(bitsize)) == NULL)
    {
        fclose(fp);
        return;
    }

    if (fread(bits, 1, bitsize, fp) &lt; bitsize)
    {
        fclose(fp);
        return;
    }

    fclose(fp);
    return;
}

void Bitmap::SaveBitmap(const char *Filename)
{
    FILE *File=NULL;

    File=fopen(Filename,&quot;wb&quot;);
    fwrite(&amp;FileHeader,sizeof(BITMAPFILEHEADER),1,File);

    fwrite(&amp;InfoHeader,sizeof(BITMAPINFOHEADER),1,File);

    fclose(File);
};
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
    #include &lt;fstream&gt;
    #include &lt;cstdlib&gt;
    #include &quot;Bitmap.hpp&quot;

int main(){
 Bitmap bmp;

    bmp.LoadBitmap(&quot;penguins.bmp&quot;);
    bmp.SaveBitmap(&quot;penguins_cod.bmp&quot;);
return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2057754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057754</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Tue, 03 May 2011 13:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 13:11:14 GMT]]></title><description><![CDATA[<p>Und hier die Header:</p>
<pre><code>Original:
424D 36C0 0000 0000 0000 3600 0000 2800
0000 8000 0000 8000 0000 0100 1800 0000
0000 00C0 0000 130B 0000 130B 0000 0000 
0000 0000 0000

Kopie:
424D FE0A 0000 0000 0000 3600 0000 2800
0000 1E00 0000 1E00 0000 0100 1800 0000
0000 C80A 0000 0000 0000 0000 0000 0000
0000 0000 0000 7D7E
</code></pre>
<p>Stellenweise passt es. Aber allein dass der Header länger geworden ist ist sehr komisch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057760</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Tue, 03 May 2011 13:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 13:11:15 GMT]]></title><description><![CDATA[<p>Den Fehler machst du bei der Angabe von Byte-Anzahl deiner Elemente (z.B. Zeile 14 in bitmap.cpp des letzten Beitrags). Es sollte heißen:</p>
<pre><code class="language-cpp">fwrite(&amp;FileHeader, 1, sizeof(FileHeader), fp)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2057761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057761</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Tue, 03 May 2011 13:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 13:14:13 GMT]]></title><description><![CDATA[<p>Die Reihenfolge ändert das Ergebnis garnicht. Ob jetzt 40 x 1 Byte in die Struktur geschrieben wird oder 1 x 40 Byte ist wohl nicht so der Unterschied. Hat auf jeden nix geändert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057767</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Tue, 03 May 2011 13:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 17:29:14 GMT]]></title><description><![CDATA[<p>Was hat denn &quot;sizeof(FileHeader)&quot; für einen Wert? Laut <a href="http://de.wikipedia.org/wiki/Windows_Bitmap" rel="nofollow">http://de.wikipedia.org/wiki/Windows_Bitmap</a> muß dabei ja 14 rauskommen.<br />
Ich tippe darauf, daß das Standard-Padding bei deinem Compiler einen zu hohen Wert hat. Beim MSVC gibt es die &quot;#pragma pack(x)&quot;-Anweisung dafür (beim gcc weiß ich nicht, ob der das auch so unterstützt).</p>
<p>s. z.B. <a href="http://www.c-plusplus.net/forum/265354" rel="nofollow">http://www.c-plusplus.net/forum/265354</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057982</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 03 May 2011 17:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 17:36:03 GMT]]></title><description><![CDATA[<p>Was soll denn eigentlich das hier bewirken:</p>
<blockquote>
<pre><code class="language-cpp">infosize = FileHeader.bfOffBits - sizeof(FileHeader); 

    infosize = 40;
</code></pre>
</blockquote>
<p>Du berechnest erst die Headergröße und überschreibst den Wert sofort wieder. Und beim Schreiben nimmst du auch wieder eine (möglicherweise andere) Header-Größe an.</p>
<p>PS: HAst du schon mal an fstream gedacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057991</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 03 May 2011 17:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Tue, 03 May 2011 19:42:11 GMT]]></title><description><![CDATA[<p>Wie wärs mit C++ (hat CStoll schon gesagt)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058083</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 03 May 2011 19:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Thu, 05 May 2011 15:00:46 GMT]]></title><description><![CDATA[<p>Da infosize zunächst noch nich richtig eingelesen werden kann, setz ich den Wert manuell auf 40, was meiner Meinung nach ein korrekter Wert ist.</p>
<p>Mit fstream hab ichs auch versucht. Da kam ähnlicher Mist bei raus. Ganz ganz komisch. Gibt es keine fertigen Packete für sowas? Ich muss es ja nich unbedingt selbst schreiben. Aber ich kann auch im Internet nix finden.</p>
<p>Gruß<br />
jabaa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059040</guid><dc:creator><![CDATA[jabaa]]></dc:creator><pubDate>Thu, 05 May 2011 15:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Thu, 05 May 2011 16:39:28 GMT]]></title><description><![CDATA[<p>Deswegen solltest du trotzdem mal prüfen, ob die beiden Header-Strukturen die richtige Größe haben. Wenn dein Compiler dort einige Füll-Bytes einbaut, um die Elemente besser im Speicher ausrichten zu können, passt die Daten-Anordnung nicht mehr zum Dateiinhalt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059119</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 May 2011 16:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to Bitmap lesen und schreiben on Thu, 05 May 2011 17:18:52 GMT]]></title><description><![CDATA[<p>Hallo jabaa,</p>
<p>hast du meinen Beitrag nicht gelesen oder aber nicht verstanden, was ich dir mit &quot;Padding&quot; nahelegen wollte?</p>
<p>So wie CStoll geschrieben hat, baut der Compiler (aus Performance-Gründen) einige Füll-Bytes (&quot;Padding&quot;) ein, um z.B. Integer auf einer durch 4 teilbaren Adresse abzulegen.<br />
Um das Abzustellen, gibt es die '#pragma pack(1)' - Direktive (aber wie schon geschrieben, je nach Compiler etwas modifiziert)...</p>
<p>Und mein Link zeigt eine Bitmap-Leseroutine aus diesem Forum...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2059138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2059138</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 05 May 2011 17:18:52 GMT</pubDate></item></channel></rss>