<?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[diverse Fragen zu Bildformat einlesen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte damit anfangen, kleine einfache Bilder zu verarbeiten. Als Format habe ich mir Windows Bitmap ausgewählt.</p>
<p>Um da besser durchzusteigen, will ich die Bytes der Datei erst mal nur ausgeben. Beschränke mich zum Anfang aber nur auf den Kopf und die Eigenschaften. Denn dort fangen schon genug Fragen an.</p>
<p>Als Grundlage habe ich den entsprechenden wiki-Artikel genommen.</p>
<p><a href="https://de.wikipedia.org/wiki/Windows_Bitmap#Dateiformat_.28Version_3.29" rel="nofollow">https://de.wikipedia.org/wiki/Windows_Bitmap#Dateiformat_.28Version_3.29</a></p>
<pre><code>struct Head
{
    static const int Size = 4;
    std::array &lt;std::string, Size&gt; bName {{ &quot;bfType&quot;, &quot;bfSize&quot;, &quot;bfReserved&quot;, &quot;bfOffbits&quot; }};
    std::array &lt;int, Size&gt; bName_size {{ 2,4,4,4, }};
}head;

struct Info
{
    static const int Size = 11;
    std::array &lt;std::string, Size&gt; bName {{ &quot;biSize&quot;, &quot;biWidth&quot;, &quot;biHeight&quot;, &quot;biPlanes&quot;, &quot;biBitCount&quot;, &quot;biCompression&quot;, &quot;biSizeImage&quot;, &quot;biXPelsPerMeter&quot;, &quot;biYPelsPerMeter&quot;, &quot;biClrUsed&quot;, &quot;biClrImportant&quot; }};
    std::array &lt;int, Size&gt; bName_size {{ 4,4,4,2,2, 4,4,4,4,4,4 }};
}info;

struct dummy //nur ein dummy-struct für spätere Inhalte
{
    std::vector &lt;char&gt; dValue;
};

int main()
{

    std::vector &lt;char&gt; picmap;
    char byte;
    size_t offset = 0;

    std::string file_name = &quot;WOLKEN.bmp&quot;;
    std::ifstream file (file_name.c_str(), std::ios::binary|std::ios::in);
    while (file.get(byte)) picmap.push_back(byte);

    std::cout &lt;&lt; &quot;_Head_&quot; &lt;&lt; '\n';
    for (int i=0; i&lt;head.Size; i++)
    {
        std::cout &lt;&lt; '#' &lt;&lt; std::dec &lt;&lt; offset &lt;&lt; &quot;  &quot; &lt;&lt; head.bName.at(i) &lt;&lt; std::setw(11);
        for (int j=0; j&lt;head.bName_size.at(i); j++)
        {
            std::cout &lt;&lt; std::hex &lt;&lt; int(picmap.at(offset)) &lt;&lt; ' ';
            offset ++;
        }
        std::cout &lt;&lt; '\n';
    }

    std::cout &lt;&lt; '\n' &lt;&lt; &quot;_Info_&quot; &lt;&lt; '\n';
    for (int i=0; i&lt;info.Size; i++)
    {
        std::cout &lt;&lt; '#' &lt;&lt; std::dec &lt;&lt; offset &lt;&lt; &quot;  &quot; &lt;&lt; info.bName.at(i) &lt;&lt; std::setw(11);
        for (int j=0; j&lt;info.bName_size.at(i); j++)
        {
            std::cout &lt;&lt; std::hex &lt;&lt; int(picmap.at(offset)) &lt;&lt; ' ';
            offset ++;
        }
        std::cout &lt;&lt; '\n';
    }

}
</code></pre>
<p>Nun meine Fragen:</p>
<p>1 - ist es möglich die structs zu etwas größeren zusammenzufassen? Habe etwas über struct in einem struct nachgeschlagen, wollte aber wissen, ob es etwas besseres gibt.</p>
<p>2 - Ich wollte setw() für einen übersichtlichen Ausdruck nehmen, nur funktioniert das nicht, wie ich mir das vorstelle.<br />
<a href="http://abload.de/image.php?img=unbenanntfnou7.png" rel="nofollow">http://abload.de/image.php?img=unbenanntfnou7.png</a><br />
Wie macht man das korrekt?</p>
<p>3 - Zum Einlesen eines Byte habe ich ein char genommen, nur frage ich mich, ob das korrekt ist, oder was man da besser nimmt?</p>
<p>4 - Wo und wie müsste ich eventuelle Kommentare setzen, damit ein geneigter Helfer schneller den Code überblicken kann? Bei zB Zeile 32 'Bytes der Datei in vector einlesen' stelle ich mir überflüssig vor?</p>
<p>Es würden zu dem Code noch weitere kleine Fragen kommen, würde aber gerne erst die oberen Punkte abhaken.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335804/diverse-fragen-zu-bildformat-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 04:14:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335804.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Dec 2015 19:45:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 19:45:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte damit anfangen, kleine einfache Bilder zu verarbeiten. Als Format habe ich mir Windows Bitmap ausgewählt.</p>
<p>Um da besser durchzusteigen, will ich die Bytes der Datei erst mal nur ausgeben. Beschränke mich zum Anfang aber nur auf den Kopf und die Eigenschaften. Denn dort fangen schon genug Fragen an.</p>
<p>Als Grundlage habe ich den entsprechenden wiki-Artikel genommen.</p>
<p><a href="https://de.wikipedia.org/wiki/Windows_Bitmap#Dateiformat_.28Version_3.29" rel="nofollow">https://de.wikipedia.org/wiki/Windows_Bitmap#Dateiformat_.28Version_3.29</a></p>
<pre><code>struct Head
{
    static const int Size = 4;
    std::array &lt;std::string, Size&gt; bName {{ &quot;bfType&quot;, &quot;bfSize&quot;, &quot;bfReserved&quot;, &quot;bfOffbits&quot; }};
    std::array &lt;int, Size&gt; bName_size {{ 2,4,4,4, }};
}head;

struct Info
{
    static const int Size = 11;
    std::array &lt;std::string, Size&gt; bName {{ &quot;biSize&quot;, &quot;biWidth&quot;, &quot;biHeight&quot;, &quot;biPlanes&quot;, &quot;biBitCount&quot;, &quot;biCompression&quot;, &quot;biSizeImage&quot;, &quot;biXPelsPerMeter&quot;, &quot;biYPelsPerMeter&quot;, &quot;biClrUsed&quot;, &quot;biClrImportant&quot; }};
    std::array &lt;int, Size&gt; bName_size {{ 4,4,4,2,2, 4,4,4,4,4,4 }};
}info;

struct dummy //nur ein dummy-struct für spätere Inhalte
{
    std::vector &lt;char&gt; dValue;
};

int main()
{

    std::vector &lt;char&gt; picmap;
    char byte;
    size_t offset = 0;

    std::string file_name = &quot;WOLKEN.bmp&quot;;
    std::ifstream file (file_name.c_str(), std::ios::binary|std::ios::in);
    while (file.get(byte)) picmap.push_back(byte);

    std::cout &lt;&lt; &quot;_Head_&quot; &lt;&lt; '\n';
    for (int i=0; i&lt;head.Size; i++)
    {
        std::cout &lt;&lt; '#' &lt;&lt; std::dec &lt;&lt; offset &lt;&lt; &quot;  &quot; &lt;&lt; head.bName.at(i) &lt;&lt; std::setw(11);
        for (int j=0; j&lt;head.bName_size.at(i); j++)
        {
            std::cout &lt;&lt; std::hex &lt;&lt; int(picmap.at(offset)) &lt;&lt; ' ';
            offset ++;
        }
        std::cout &lt;&lt; '\n';
    }

    std::cout &lt;&lt; '\n' &lt;&lt; &quot;_Info_&quot; &lt;&lt; '\n';
    for (int i=0; i&lt;info.Size; i++)
    {
        std::cout &lt;&lt; '#' &lt;&lt; std::dec &lt;&lt; offset &lt;&lt; &quot;  &quot; &lt;&lt; info.bName.at(i) &lt;&lt; std::setw(11);
        for (int j=0; j&lt;info.bName_size.at(i); j++)
        {
            std::cout &lt;&lt; std::hex &lt;&lt; int(picmap.at(offset)) &lt;&lt; ' ';
            offset ++;
        }
        std::cout &lt;&lt; '\n';
    }

}
</code></pre>
<p>Nun meine Fragen:</p>
<p>1 - ist es möglich die structs zu etwas größeren zusammenzufassen? Habe etwas über struct in einem struct nachgeschlagen, wollte aber wissen, ob es etwas besseres gibt.</p>
<p>2 - Ich wollte setw() für einen übersichtlichen Ausdruck nehmen, nur funktioniert das nicht, wie ich mir das vorstelle.<br />
<a href="http://abload.de/image.php?img=unbenanntfnou7.png" rel="nofollow">http://abload.de/image.php?img=unbenanntfnou7.png</a><br />
Wie macht man das korrekt?</p>
<p>3 - Zum Einlesen eines Byte habe ich ein char genommen, nur frage ich mich, ob das korrekt ist, oder was man da besser nimmt?</p>
<p>4 - Wo und wie müsste ich eventuelle Kommentare setzen, damit ein geneigter Helfer schneller den Code überblicken kann? Bei zB Zeile 32 'Bytes der Datei in vector einlesen' stelle ich mir überflüssig vor?</p>
<p>Es würden zu dem Code noch weitere kleine Fragen kommen, würde aber gerne erst die oberen Punkte abhaken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479238</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sat, 12 Dec 2015 19:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 20:28:48 GMT]]></title><description><![CDATA[<p>Als Byte verwende ich i.d.R. unsigned char.<br />
Ansonsten findet man sich im Code ja ganz gut zurecht.</p>
<p>Kannst ja noch einen Link in den Code reinstellen wo erklärt wird wie das BMP Format definiert ist, damit jemand, der das liest, sofort nachschauen kann welche Information an welcher Stelle steht.</p>
<p>Außerdem könntest du deinen Strukturen Methoden spendieren, welche sich um das Einlesen selbst kümmern. Also z.B. readFromBytes(unsigned char* prt){...}<br />
Das heißt du übergibst den Methoden einfach die Speicheradresse des ersten Bytes und die Strukturen lesen selbstständig alles nötige ein.</p>
<p>Dann schaut deine main Funktion noch übersichtlicher aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479250</guid><dc:creator><![CDATA[dfgdfgd]]></dc:creator><pubDate>Sat, 12 Dec 2015 20:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 20:47:11 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>1 - ist es möglich die structs zu etwas größeren zusammenzufassen? Habe etwas über struct in einem struct nachgeschlagen, wollte aber wissen, ob es etwas besseres gibt.</p>
</blockquote>
<p>Außer weitere structs gibt es nichts um verschiedene structs zusammenzufassen.</p>
<p>lemon03 schrieb:</p>
<blockquote>
<p>2 - Ich wollte setw() für einen übersichtlichen Ausdruck nehmen, nur funktioniert das nicht, wie ich mir das vorstelle.<br />
<a href="http://abload.de/image.php?img=unbenanntfnou7.png" rel="nofollow">http://abload.de/image.php?img=unbenanntfnou7.png</a><br />
Wie macht man das korrekt?</p>
</blockquote>
<p>Ich glaube du möchtest setw vor dem Ausgeben des Namens haben. Sonst passt die Ausrichtung aufgrund der unterschiedlichen Länge nicht. Wenn dann die Namen alle links anfangen sollten brauchst du noch <a href="http://www.cplusplus.com/reference/ios/left/" rel="nofollow">left</a>.</p>
<p>lemon03 schrieb:</p>
<blockquote>
<p>3 - Zum Einlesen eines Byte habe ich ein char genommen, nur frage ich mich, ob das korrekt ist, oder was man da besser nimmt?</p>
</blockquote>
<p>Ich nehme ein <a href="http://www.cplusplus.com/reference/cstdint/" rel="nofollow">uint8_t</a>. Das ist zwar auf den meisten Systemen die einem so begegen einen <code>unsigned char</code> aber kann ja nicht schaden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479254</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sat, 12 Dec 2015 20:47:11 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 21:37:27 GMT]]></title><description><![CDATA[<p>Ah, vielen Dank schonmal. Hilft mir schon weiter <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="🙂"
    /><br />
Bin erst mal wieder etwas beschäftigt, bevor dann eventuelle Nachfragen und die angekündigten weiteren kleinen Fragen kommen <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>Nur mit der formatierten Ausgabe werde ich es noch nicht hinbekommen. Hatte damit schon immer zu kämpfen, ohne das ich auf eine Lösung gekommen wäre. Nun ja, meine war dann immer point(set, x, y).<br />
Gibt es nicht ein setw()-ähnliches, was einfach nur am linken Rand des Konsolenfensters anfängt zu zählen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479273</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sat, 12 Dec 2015 21:37:27 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 22:41:35 GMT]]></title><description><![CDATA[<p>Sorry für die kleine Zwischenfrage, aber ich wurde gerade durch einen anderen Thread abgelenkt, in dem eine std::map vorkam.</p>
<p>Dies scheint mir für meine ersten beiden structs doch auch passend? So in der Form</p>
<pre><code>struct Head
{
     std::map &lt;std::string, int&gt; bType
    {
        {&quot;bfType&quot;, 2},
        {&quot;bfSize&quot;, 4},
        {&quot;bfReserved&quot;, 4},
        {&quot;bfOffbits&quot;, 4},
    };
}head;
</code></pre>
<p>Ist das in diesem Fall sinnvoll oder eher nicht? Denn mir scheint der Zugriff auf die einzelnen Elemente nicht richtig klar. Wie ich zB von &quot;bfType&quot; auf 2 komme, glaube ich zu kapieren, aber nicht wie ich auf &quot;bfType&quot; zugreifen kann. Lohnt sich, abgesehen vom Lerneffekt, der zusätzliche Aufwand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479290</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sat, 12 Dec 2015 22:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 22:51:40 GMT]]></title><description><![CDATA[<p>Die Verwendung einer Map macht bei dir wenig Sinn. Mit der Map könntest du etwas wie <code>bType[&quot;bfSize&quot;]</code> schreiben, was dir dann 4 liefert. Da du sowas zum einlesen des Headers aber nicht brauchst und die Map zusätzlich alle Elemente nach dem Key (dem ersten Wert) sortiert kriegst auch noch eine völlig falsche Reihenfolge. Du könntest aber vielleicht ein array oder vector von pairs nutzen:</p>
<pre><code>struct Head
{
	static const int Size = 4;
    std::array&lt;std::pair&lt;std::string, int&gt;, Size&gt; bType
    {
        {&quot;bfType&quot;, 2},
        {&quot;bfSize&quot;, 4},
        {&quot;bfReserved&quot;, 4},
        {&quot;bfOffbits&quot;, 4},
    };
} head;
</code></pre>
<p>Hier kriegst du mit <code>bType[0]-&gt;first</code> den <code>&quot;bfType&quot;</code> String und mit <code>bType[0]-&gt;second</code> deine 2. Entsprechend mit <code>bType[3]</code> das letzte Paar in deinem Array.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479294</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Sat, 12 Dec 2015 22:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sat, 12 Dec 2015 23:00:14 GMT]]></title><description><![CDATA[<p>Ah ... danke schön <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="🙂"
    /></p>
<p>Jepp, dann mache ich mal weiter ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479295</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sat, 12 Dec 2015 23:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sun, 13 Dec 2015 22:46:16 GMT]]></title><description><![CDATA[<p>Puh, ich hänge immer noch an der Ausgabe. Sie ist inzwischen zwar formatiert, hätte aber gerne die Byte-Ausgabe aufgefüllt auf zwei Zeichen, also statt <code>8</code> -&gt; <code>08</code> etc. Eine Möglichkeit besteht wohl mit <code>std::setfill('0')</code> , nur habe ich absolut keinen Plan, wo und wie ich das einsetzen kann. Es wird alles mögliche ausgefüllt, nur die Byte-Ausgabe nicht. Es ist zwar ärgerlich, das ich mich so lange mit solchen Klein-Klein beschäftigen muss, will es aber gerne endlich erledigt haben.</p>
<pre><code>//std::cout &lt;&lt; std::showbase;
    std::cout &lt;&lt; std::left;
    std::cout &lt;&lt; &quot;_Head_&quot; &lt;&lt; '\n';
    for (int i=0; i&lt;head.Size; i++)
    {
        std::cout &lt;&lt; '#' &lt;&lt; std::dec &lt;&lt; std::setw(3) &lt;&lt; offset &lt;&lt; std::setw(17) &lt;&lt; head.bType.at(i).first;
        for (int j=0; j&lt;head.bType.at(i).second; j++)
        {
            std::cout &lt;&lt; std::hex &lt;&lt; int(picmap.at(offset)) &lt;&lt; ' ';
            offset ++;
        }
        std::cout &lt;&lt; '\n';
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2479415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479415</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sun, 13 Dec 2015 22:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Sun, 13 Dec 2015 22:51:08 GMT]]></title><description><![CDATA[<p>Ich habe dann noch eine zweite Sache, die mir aufgefallen ist. Schreiber lieber einen neuen Beitrag dafür, das man dies besser auseinander halten kann.</p>
<p>Habe ich hier eine Diskrepanz zwischen dem Wiki-Artikel und meiner Ausgabe?</p>
<p>Im Artikel steht bei <code>biHeight</code></p>
<blockquote>
<p>Der Betrag gibt die Höhe der Bitmap in Pixel an.</p>
<p>Ist der Wert positiv, so ist die Bitmap eine sogenannte &quot;bottom-up&quot;-Bitmap (die Bilddaten beginnen mit der untersten und enden mit der obersten Bildzeile). Dies ist die gebräuchlichste Variante.<br />
Ist der Wert negativ, so ist die Bitmap eine &quot;top-down&quot;-Bitmap (die Bilddaten beginnen mit der obersten und enden mit der untersten Bildzeile).</p>
</blockquote>
<p>Bei mir scheint aber <code>biWidth</code> negativ? Denn <code>ffffff</code> bdeutet doch negativ?<br />
<a href="http://abload.de/image.php?img=unbenannt282q3n.png" rel="nofollow">http://abload.de/image.php?img=unbenannt282q3n.png</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479416</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Sun, 13 Dec 2015 22:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 08:29:44 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>Sie ist inzwischen zwar formatiert, hätte aber gerne die Byte-Ausgabe aufgefüllt auf zwei Zeichen, also statt <code>8</code> -&gt; <code>08</code> etc. Eine Möglichkeit besteht wohl mit <code>std::setfill('0')</code> , nur habe ich absolut keinen Plan, wo und wie ich das einsetzen kann.</p>
</blockquote>
<p>Du hast <code>setw</code> ja jetzt schon richtig benutzt. Mit <code>setfill</code> kannst du festlegen mit welchem Zeichen aufgefüllt werden soll. Standardmäßig wird mit Leerzeichen aufgefüllt. Vor der Ausgabe der Bytes stellst du also auf '0' um, außerdem wieder ausrichtung nach rechts und dann vor jedem Byte ein <code>setw(2)</code> . Aber ich muss zugeben, dass die iomanip geschichten ziemlich nervig sind.</p>
<p>lemon03 schrieb:</p>
<blockquote>
<p>Bei mir scheint aber <code>biWidth</code> negativ? Denn <code>ffffff</code> bdeutet doch negativ?</p>
</blockquote>
<p>Benutze mal <code>unsigned char</code> statt <code>char</code> für Bytes überall. Oder testweise noch einen zusätzichen Cast:</p>
<pre><code>int(unsigned char(picmap.at(offset)))
</code></pre>
<p>Ich bin mir ziemlich sicher, dass dies nur ein Fehler bei der Ausgabe ist und die ffffff am Anfang da gar nicht stehen sollten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479437</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 14 Dec 2015 08:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 10:15:22 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>1 - ist es möglich die structs zu etwas größeren zusammenzufassen? Habe etwas über struct in einem struct nachgeschlagen, wollte aber wissen, ob es etwas besseres gibt.</p>
</blockquote>
<p>Hallo lemon03, <s>zu was größeren nicht</s>. Aber was spricht dagegen die structs Head und Info eins zu eins wie im Wikipedia-Artikel aufzubauen.<br />
Also ohne array, maps oder vector. Ich hab den Artikel nur überflogen aber die Felder von 'Dateikopf' und 'Informationsblock' sind doch statisch, oder?<br />
Dann könntest du evtl. den operator&gt;&gt; zum einlesen überladen.</p>
<pre><code>struct Head {
  uint16_t bfType; // ASCII-Zeichenkette &quot;BM&quot; (Hex: 0x42 0x4D Dez: 19778).
  uint32_t bfSize; // Größe der BMP-Datei in Byte. (unzuverlässig)
  uint32_t bfReserved; // Reserviert, von der Software abhängig, standardmäßig 0
[...]
}
</code></pre>
<p>Edit: Zu was größerem schon, später alles in eine class BMP oder so...<br />
... und Head und Info kann man evtl. zusammenlegen... Die 'struct BITMAPINFOHEADER' fängt ja bei Offset 14 an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479442</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 10:15:22 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 11:39:07 GMT]]></title><description><![CDATA[<p>dirkski schrieb:</p>
<blockquote>
<p>Hallo lemon03, <s>zu was größeren nicht</s>. Aber was spricht dagegen die structs Head und Info eins zu eins wie im Wikipedia-Artikel aufzubauen.<br />
Also ohne array, maps oder vector. Ich hab den Artikel nur überflogen aber die Felder von 'Dateikopf' und 'Informationsblock' sind doch statisch, oder?<br />
Dann könntest du evtl. den operator&gt;&gt; zum einlesen überladen.</p>
<pre><code>struct Head {
  uint16_t bfType; // ASCII-Zeichenkette &quot;BM&quot; (Hex: 0x42 0x4D Dez: 19778).
  uint32_t bfSize; // Größe der BMP-Datei in Byte. (unzuverlässig)
  uint32_t bfReserved; // Reserviert, von der Software abhängig, standardmäßig 0
[...]
}
</code></pre>
</blockquote>
<p>Tja, hab ich jetzt zu einfach gedacht. Wollte ich das jetzt einfach mit<br />
istream.read(struct_nach_char_cast, 14) den Dateikopf einlesen, aber nix:</p>
<p>Das zweite Feld (bfSize) in meiner struct oben wird auf 4 Bytes ausgerichtet, meh! Alle nachfolgende Werte falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Mal abgesehen von der endian-Problematik...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479459</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 11:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:28:39 GMT]]></title><description><![CDATA[<p>[quote=&quot;sebi707&quot;]</p>
<p>lemon03 schrieb:</p>
<blockquote>
<p>lemon03 schrieb:</p>
<blockquote>
<p>Bei mir scheint aber <code>biWidth</code> negativ? Denn <code>ffffff</code> bdeutet doch negativ?</p>
</blockquote>
<p>Benutze mal <code>unsigned char</code> statt <code>char</code> für Bytes überall. Oder testweise noch einen zusätzichen Cast:</p>
<pre><code>int(unsigned char(picmap.at(offset)))
</code></pre>
<p>Ich bin mir ziemlich sicher, dass dies nur ein Fehler bei der Ausgabe ist und die ffffff am Anfang da gar nicht stehen sollten.</p>
</blockquote>
<p>Mmh, aber alle Indizien deuten eher doch auf ein negatives Vorzeichen? Im Artikel selbst kann ein Wert negativ sein, je nach Bitmap.<br />
Ich müsste tatsächlich diesen Cast nehmen, denn bei <code>unsigned char</code> oder <code>uint8_t</code> bekomme ich dort einen Fehler, weil ein Wert größer ist als genau ein Byte.<br />
Und wenn ich einfach ohne Formatierung nur alle Bytes untereinander ausgebe, bekomme ich auch bei i=18 ein <code>ffffffa0</code> .</p>
<pre><code>std::string file_name = &quot;WOLKEN.bmp&quot;;
    std::ifstream file (file_name.c_str(), std::ios::binary|std::ios::in);
    int i = 0;
    while (i &lt; 32+4)
    {
        file.get (byte);
        std::cout &lt;&lt; std::dec &lt;&lt; i &lt;&lt; &quot;  &quot; &lt;&lt; std::hex &lt;&lt; int(byte) &lt;&lt; '\n';
        i ++;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2479463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479463</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:30:11 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>lemon03 schrieb:</p>
<blockquote>
<p>Bei mir scheint aber <code>biWidth</code> negativ? Denn <code>ffffff</code> bdeutet doch negativ?</p>
</blockquote>
<p>Benutze mal <code>unsigned char</code> statt <code>char</code> für Bytes überall. Oder testweise noch einen zusätzichen Cast:</p>
<pre><code>int(unsigned char(picmap.at(offset)))
</code></pre>
<p>Ich bin mir ziemlich sicher, dass dies nur ein Fehler bei der Ausgabe ist und die ffffff am Anfang da gar nicht stehen sollten.</p>
</blockquote>
<p>Mmh, aber alle Indizien deuten eher doch auf ein negatives Vorzeichen? Im Artikel selbst kann ein Wert negativ sein, je nach Bitmap.<br />
Ich müsste tatsächlich diesen Cast nehmen, denn bei <code>unsigned char</code> oder <code>uint8_t</code> bekomme ich dort einen Fehler, weil ein Wert größer ist als genau ein Byte.<br />
Und wenn ich einfach ohne Formatierung nur alle Bytes untereinander ausgebe, bekomme ich auch bei i=18 ein <code>ffffffa0</code> .</p>
<pre><code>std::string file_name = &quot;WOLKEN.bmp&quot;;
    std::ifstream file (file_name.c_str(), std::ios::binary|std::ios::in);
    int i = 0;
    while (i &lt; 32+4)
    {
        file.get (byte);
        std::cout &lt;&lt; std::dec &lt;&lt; i &lt;&lt; &quot;  &quot; &lt;&lt; std::hex &lt;&lt; int(byte) &lt;&lt; '\n';
        i ++;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2479464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479464</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:30:11 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:39:12 GMT]]></title><description><![CDATA[<p>ffffffa0 passt nicht in ein Byte.<br />
a0 schon eher. Wenn der Wert² signed ist und du expandierst ihn zu einem (32-Bit) int, kommen die ff dazu.</p>
<p>²der Variablentyp, in der der Wert gespeichert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479465</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:39:22 GMT]]></title><description><![CDATA[<p>@ dirkski</p>
<p>Danke für die Anregungen, aber die momentane Ausgabe soll nur dazu dienen, überhaupt in eine solche Bitmap-Struktur durchzusteigen, also erst mal alle Werte laut Tabelle nachvollziehbar auszugeben.</p>
<p>Später interessieren mich nur die Farbwerte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479466</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:41:32 GMT]]></title><description><![CDATA[<p>Ups, da haben wir uns jetzt überschnitten.</p>
<p>DirkB schrieb:</p>
<blockquote>
<p>ffffffa0 passt nicht in ein Byte.<br />
a0 schon eher. Wenn der Wert² signed ist und du expandierst ihn zu einem (32-Bit) int, kommen die ff dazu.</p>
<p>²der Variablentyp, in der der Wert gespeichert ist.</p>
</blockquote>
<p>Bin noch beim Überlegen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479467</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:41:32 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:54:52 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>Bin noch beim Überlegen ...</p>
</blockquote>
<p>Du hast doch vier Bytes ausgegeben, die zu biWidth gehören.<br />
Wo soll denn da der lange Wert her kommen?</p>
<p>Ich habe die Ausgabe nur ganz kurz gesehen, da sich bei <a href="http://abload.de" rel="nofollow">abload.de</a> gleich wieder ein Fenster/Popup davor gesetzt hat. Und auf solchen Seite klicke ich nichts an.<br />
Copy&amp;Paste der Konsole mit Code-Tags geht auch.</p>
<p>Das sieht dann so aus:</p>
<pre><code>Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. Alle Rechte vorbehalten.

C:\&gt;
</code></pre>
<p>Und jeder kann es lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479468</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 13:56:08 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>@ dirkski</p>
<p>Danke für die Anregungen, aber die momentane Ausgabe soll nur dazu dienen, überhaupt in eine solche Bitmap-Struktur durchzusteigen, also erst mal alle Werte laut Tabelle nachvollziehbar auszugeben.</p>
<p>Später interessieren mich nur die Farbwerte.</p>
</blockquote>
<p>Ok, würde aber evtl. einfacher gehen auf die Member zuzugreifen...</p>
<p>Hier als Vorschlag (ist nicht perfekt):</p>
<pre><code>#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;iomanip&gt;
#include &lt;exception&gt;

struct BMPFileHeader {
  uint16_t bfType;      // ASCII-Zeichenkette &quot;BM&quot; (Hex: 0x42 0x4D Dez: 19778).
  uint32_t bfSize;      // Größe der BMP-Datei in Byte. (unzuverlässig)
  uint32_t bfReserved;  // Reserviert, von der Software abhängig, standardmäßig 0
  uint32_t bfOffBits;   // Offset der Bilddaten in Byte vom Beginn der Datei an, bei Echtfarben fast immer 54 (manche Software ignoriert diese Angabe daher fehlerhafterweise).
};

struct BMPInfoHeader {
  uint32_t biSize;          // 40 (Größe der BITMAPINFOHEADER-Struktur in Byte)
  int32_t  biWidth;         // Breite der Bitmap in Pixel.
  int32_t  biHeight;        // Der Betrag gibt die Höhe der Bitmap in Pixel an.
                            // Ist der Wert positiv, so ist die Bitmap eine sogenannte &quot;bottom-up&quot;-Bitmap
                            //   (die Bilddaten beginnen mit der untersten und enden mit der obersten Bildzeile).
                            //   Dies ist die gebräuchlichste Variante.
                            // Ist der Wert negativ, so ist die Bitmap eine &quot;top-down&quot;-Bitmap
                            //   (die Bilddaten beginnen mit der obersten und enden mit der untersten Bildzeile).
  uint16_t biPlanes;        // 1 (Stand in einigen älteren Formaten wie PCX für die Anzahl der Farbebenen,
                            //   wird aber für BMP nicht verwendet)
  uint16_t biBitCount;      // Gibt die Farbtiefe der Bitmap in bpp an; muss einer der folgenden Werte sein:
                            //   1, 4, 8, 16, 24 oder 32. Bei 1, 4 und 8 bpp sind die Farben indiziert.
  uint32_t biCompression;   // Einer der folgenden Werte:
                            //   0 (BI_RGB): Bilddaten sind unkomprimiert.
                            //   1 (BI_RLE8): Bilddaten sind lauflängenkodiert für 8 bpp. Nur erlaubt wenn biBitCount=8 und biHeight positiv.
                            //   2 (BI_RLE4): Bilddaten sind lauflängenkodiert für 4 bpp. Nur erlaubt wenn biBitCount=4 und biHeight positiv.
                            //   3 (BI_BITFIELDS): Bilddaten sind unkomprimiert und benutzerdefiniert (mittels Farbmasken) kodiert. Nur erlaubt wenn biBitCount=16 oder 32.
  uint32_t biSizeImage;     // Wenn biCompression=BI_RGB: Entweder 0 oder die Größe der Bilddaten in Byte.
                            //  Ansonsten: Größe der Bilddaten in Byte.
  int32_t  biXPelsPerMeter; // Horizontale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt.
  int32_t  biYPelsPerMeter; // Vertikale Auflösung des Zielausgabegerätes in Pixel pro Meter; wird aber für BMP-Dateien meistens auf 0 gesetzt.
  uint32_t biClrUsed;       // Wenn biBitCount=1: 0.
                            //  Wenn biBitCount=4 oder 8: die Anzahl der Einträge der Farbtabelle; 0 bedeutet die maximale Anzahl (2, 16 oder 256).
                            //  Ansonsten: Die Anzahl der Einträge der Farbtabelle (0=keine Farbtabelle). Auch wenn sie in diesem Fall nicht notwendig ist, kann dennoch eine für die Farbquantisierung empfohlene Farbtabelle angegeben werden.
  uint32_t biClrImportant;  // Wenn biBitCount=1, 4 oder 8: Die Anzahl sämtlicher im Bild verwendeten Farben; 0 bedeutet alle Farben der Farbtabelle.
                            //  Ansonsten:
                            //  Wenn eine Farbtabelle vorhanden ist und diese sämtliche im Bild verwendeten Farben enthält: deren Anzahl.
                            //  Ansonsten: 0.
};

struct BMP {
  BMPFileHeader head;
  BMPInfoHeader info;
};

std::istream &amp; operator&gt;&gt;(std::istream &amp; is, BMPFileHeader &amp; head) {
  std::cerr &lt;&lt; __func__ &lt;&lt; &quot; (BMPFileHeader): &quot;;

  if(is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;head.bfType), sizeof(uint16_t) );

  if(is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;head.bfSize), sizeof(uint32_t)*3 ); // bfSize ... bfOffBits = 3*

  if(!is.good()) {
    std::cerr &lt;&lt; &quot;read error (BMPFileHeader)!\n&quot;;
    return is;
  }

  std::cerr &lt;&lt; &quot; bfType = &quot; &lt;&lt; head.bfType
            &lt;&lt; &quot;, bfSize = &quot; &lt;&lt; head.bfSize
            &lt;&lt; &quot;, bfReserved = &quot; &lt;&lt; head.bfReserved
            &lt;&lt; &quot;, bfOffBits = &quot; &lt;&lt; head.bfOffBits
            &lt;&lt; &quot; (is.tellg() = &quot; &lt;&lt; is.tellg() &lt;&lt; &quot;)\n&quot;;

  return is;
}

std::istream &amp; operator&gt;&gt;(std::istream &amp; is, BMPInfoHeader &amp; info) noexcept {
  std::cerr &lt;&lt; __func__ &lt;&lt; &quot; (BMPInfoHeader): &quot;;

  if( is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;info), sizeof(uint32_t)*3 );
  if( is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;info.biPlanes), sizeof(uint16_t)*2 );
  if( is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;info.biCompression), sizeof(uint32_t)*6 );

  if(!is.good()) {
    std::cerr &lt;&lt; &quot;read error (BMPInfoHeader)!\n&quot;;
    return is;
  }

  std::cerr &lt;&lt; &quot; biSize: &quot; &lt;&lt; info.biSize
            &lt;&lt; &quot;, biWidth: &quot; &lt;&lt; info.biWidth
            &lt;&lt; &quot;, biHeight: &quot; &lt;&lt; info.biHeight
            &lt;&lt; &quot;, biPlanes: &quot; &lt;&lt; info.biPlanes
            &lt;&lt; &quot;, biBitCount: &quot; &lt;&lt; info.biBitCount
            &lt;&lt; &quot;, biCompression: &quot; &lt;&lt; info.biCompression
            &lt;&lt; &quot; (is.tellg() = &quot; &lt;&lt; is.tellg() &lt;&lt; &quot;)\n&quot;;

  return is;
}

std::istream &amp; operator&gt;&gt;(std::istream &amp; is, BMP &amp; bmp) {
  std::cerr &lt;&lt; __func__ &lt;&lt; &quot; (BMP): &quot;;

  is &gt;&gt; bmp.head &gt;&gt; bmp.info;
  if(!is.good()) {
    std::cerr &lt;&lt; &quot;read error (BMP)!\n&quot;;
    return is;
  }

  return is;
}

int main(int argc, char *argv[])
{
  std::string filename;
  if( argv[1])
    filename = argv[1];
  else
    filename = &quot;/usr/share/xml/docbook/stylesheet/nwalsh/1.78.1/slides/slidy/graphics/unfold.bmp&quot;;

  std::ifstream file (filename.c_str(), std::ios::binary|std::ios::in);

//  BMPFileHeader head;

//  if (file.good())
//    file &gt;&gt; head;

//  BMPInfoHeader info;
//  if (file.good())
//    file &gt;&gt; info;

  BMP bmp;
  if (file.good())
    file &gt;&gt; bmp;

//  while (file.get(byte)) picmap.push_back(byte);

  return EXIT_SUCCESS;
}
</code></pre>
<p>Die structs habe ich einfach aus wp kopiert und alles überflüssige gelöscht bzw. Kommentare eingefügt.</p>
<p>Ob die Lese-Routine mit den vielen reads jetz gut ist weiß ich nicht (auf die Performance bezogen)...</p>
<p>cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479469</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 13:56:08 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 14:04:14 GMT]]></title><description><![CDATA[<p><code>biHeight</code> als Höhe der Bitmap wird ja korrekt in Pixel ausgegeben.</p>
<p>Nur wenn bei mir irgendwo ein mir nicht nachvollziehbarer Fehler auftaucht, klappt gleich gar nichts mehr. Wollte jetzt casten, um zu schauen, ob ohne Vorzeichen bei <code>biWidth</code> der Wert auch korrekt ist, aber bekomme wieder irgendwelche Fehlermeldungen wegen fehlenden Semikolon und son Kram ... nerv</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479470</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 14:09:12 GMT]]></title><description><![CDATA[<p>@ nochmal dirkski</p>
<p>Uh, danke für die Mühe <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="🙂"
    /> Auf den ersten Blick sieht das in etwa so aus, wie ich es auch mal vor Augen hatte, nur wie das ausgeschrieben wird, war mir unklar. Aber ich müsste mich in das Beispiel etwas einarbeiten, denn einiges ist mir nicht sofort bekannt.</p>
<p>Aber im Moment habe ich ja noch Schwierigkeiten mit meinem eigenen Code, dessen Fehler ich erst mal verstehen muss, bevor ich mich an komplexere wage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479471</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 14:10:55 GMT]]></title><description><![CDATA[<p>dirkski schrieb:</p>
<blockquote>
<pre><code>#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;iomanip&gt;
#include &lt;exception&gt;

[...]

std::istream &amp; operator&gt;&gt;(std::istream &amp; is, BMPFileHeader &amp; head) {
  std::cerr &lt;&lt; __func__ &lt;&lt; &quot; (BMPFileHeader): &quot;;

  if(is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;head.bfType), sizeof(uint16_t) );

  if(is.good())
    is.read(reinterpret_cast&lt;char*&gt;(&amp;head.bfSize), sizeof(uint32_t)*3 ); // bfSize ... bfOffBits = 3*

  if(!is.good()) {
    std::cerr &lt;&lt; &quot;read error (BMPFileHeader)!\n&quot;;
    return is;
  }

  std::cerr &lt;&lt; &quot; bfType = &quot; &lt;&lt; head.bfType
            &lt;&lt; &quot;, bfSize = &quot; &lt;&lt; head.bfSize
            &lt;&lt; &quot;, bfReserved = &quot; &lt;&lt; head.bfReserved
            &lt;&lt; &quot;, bfOffBits = &quot; &lt;&lt; head.bfOffBits
            &lt;&lt; &quot; (is.tellg() = &quot; &lt;&lt; is.tellg() &lt;&lt; &quot;)\n&quot;;

  return is;
}
[...]
</code></pre>
</blockquote>
<p>Da wo jetzt die Ausgaben mit std::cerr sind kannst du bequem eine Plausibilitätsprüfung einfügen. Falls die fehlschlägt einfach das failbit vom stream setzen und mit return den inputstream zurückgeben... So gesehen braucht man nicht alle Prüfungen auf stream.good() zu machen (Eigentlich keine?). Geht also kürzer, mein ich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479472</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 14:13:12 GMT]]></title><description><![CDATA[<p>Oh, das mit abload tut mir leid. Bei mir poppt trotz Akzeptanz aller scripte nichts auf.</p>
<p>Aber hier der Inhalt, wie es im Moment ausschaut:</p>
<pre><code>_Head_
#0  bfType           42 4d           19778
#2  bfSize           36 40 2  0           147510
#6  bfReserved       0  0  0  0                0
#10 bfOffbits        36 4  0  0             1078

_Info_
#14 biSize           28 0 0 0              40
#18 biWidth          ffffffa0 1 0 0             160
#22 biHeight         60 1 0 0             352
#26 biPlanes         1 0               1
#28 biBitCount       8 0               8
#30 biCompression    0 0 0 0               0
#34 biSizeImage      0 0 0 0               0
#38 biXPelsPerMeter  23 2e 0 0           11811
#42 biYPelsPerMeter  23 2e 0 0           11811
#46 biClrUsed        0 1 0 0             256
#50 biClrImportant   0 1 0 0             256

Process returned 0 (0x0)   execution time : 0.026 s
Press any key to continue.
</code></pre>
<p>Die dritte Spalte sind jetzt die Dezimalwerte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479473</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 14:18:13 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>@ nochmal dirkski</p>
<p>Uh, danke für die Mühe <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="🙂"
    /> Auf den ersten Blick sieht das in etwa so aus, wie ich es auch mal vor Augen hatte, nur wie das ausgeschrieben wird, war mir unklar. Aber ich müsste mich in das Beispiel etwas einarbeiten, denn einiges ist mir nicht sofort bekannt.</p>
<p>Aber im Moment habe ich ja noch Schwierigkeiten mit meinem eigenen Code, dessen Fehler ich erst mal verstehen muss, bevor ich mich an komplexere wage.</p>
</blockquote>
<p>Ok <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="🙂"
    /></p>
<p>Eigentlich brauchst du auch nur einen operator&gt;&gt; (oder einfach eine Funktion) überladen bzw. schreiben.</p>
<p>Das ich jetzt jeweils einen für Head und Info habe und dann einen für das gesamte kam dadurch das ich halt erst mit Head angefangen habe.</p>
<p>Falls du es noch nicht so hast mit operator-Überladung nehme doch einfach eine Funktion ala decodeBMP(istream);</p>
<p>Mach jetzt etwas Pause...</p>
<p>PS: das noexcept irgendwo bei mir im Code sollte wieder raus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479475</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:18:13 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 15:00:43 GMT]]></title><description><![CDATA[<p>So erst mal sorry für das Durcheinander meiner Beträge hier ... <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>Habe jetzt ein anderes bmp genommen bzw dazu konvertiert und diesmal gibt es keine Ungereimtheiten bei den Werten. Passt alles, wie es auch in den Eigenschaften der Datei steht. Hatte ich wohl anfangs ein schlechtes Beispiel gewählt.</p>
<p>Nur mit dem Wert 'Auflösung des Zielausgabegerätes in Pixel pro Meter' kann ich noch nichts anfangen, aber ist wohl eher vernachlässigbar.</p>
<p>Mache jetzt erst mal mit der Formatierung der Ausgabe weiter bis ich das verdammt noch mal begriffen habe ...</p>
<p>Dann schaue ich mir den Code von dirkski an, und dann geht es weiter mit den Farbmasken, -tabellen und Bilddaten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479478</guid><dc:creator><![CDATA[zeropage]]></dc:creator><pubDate>Mon, 14 Dec 2015 15:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to diverse Fragen zu Bildformat einlesen on Mon, 14 Dec 2015 16:13:44 GMT]]></title><description><![CDATA[<p>lemon03 schrieb:</p>
<blockquote>
<p>Dann schaue ich mir den Code von dirkski an, und dann geht es weiter mit den Farbmasken, -tabellen und Bilddaten.</p>
</blockquote>
<p>Ich schreib dir gerade eine Zusammenfassung wie ich vorgegangen bin, damit ich auch noch was lerne <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="🙂"
    /> kannst dir also noch etwas Zeit lassen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479497</guid><dc:creator><![CDATA[dirkski]]></dc:creator><pubDate>Mon, 14 Dec 2015 16:13:44 GMT</pubDate></item></channel></rss>