Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Fehler beim erstellen einer Bitmap Datei

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.08.2008, 15:20 Uhr
~0_saya_0
Gast


Hallo,

ich bin neu in C/C++ und bräuchte deswegen Hilfe bei folgendem Problem.
Ich versuch eine Bitmap Datei zu erstellen. Das Programm zeigt mir soweit keine Fehler an, jedoch wenn ich versuche die Bitmap zu öffnen ist keine Vorschau verfügbar. Die Größe der Bitmapdatei sagt mir jedenfalls das da irgendwas sein muss.

Hier ist der Code. Bin für Vorschläge dankbar

Code:
//
#pragma once
  
#include "stdafx.h"
#include <windows.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void wait ()
{
    std::cin.clear();
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    std::cin.get();
}

int main(){

    int i,j,r;

    ofstream bmpdata("BITMAP.bmp", ios::out|ios::binary); //begin stream
    
    if (!bmpdata) return 1;

    BITMAPINFOHEADER bmpinfo; //Infoheader Data
    bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.biWidth = 256;
    bmpinfo.biHeight = 256;
    bmpinfo.biPlanes = 1;
    bmpinfo.biBitCount = 24;                                                            
    bmpinfo.biCompression = BI_RGB;
    bmpinfo.biSizeImage = 0;
    bmpinfo.biXPelsPerMeter = 0;
    bmpinfo.biYPelsPerMeter = 0;
    bmpinfo.biClrUsed = 0;
    bmpinfo.biClrImportant = 0;

    BITMAPFILEHEADER bmpfile;    //Fileheader Data
    bmpfile.bfType = 'BM';
    bmpfile.bfSize = (bmpinfo.biWidth * bmpinfo.biHeight * (bmpinfo.biBitCount / 8)) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //aggregate - bmpfile
    bmpfile.bfReserved1 = 0;
    bmpfile.bfReserved2 = 0;
    bmpfile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    bmpdata.write((char*)&bmpinfo, sizeof(bmpinfo));
    bmpdata.write((char*)&bmpfile, sizeof(bmpfile));

    if(bmpinfo.biBitCount == 24){ //fill image
        RGBQUAD bmp;;
        for(r=0;r < 256; r++)   {
            bmp.rgbBlue = r;
            bmp.rgbGreen = r;
            bmp.rgbRed = r;
            bmp.rgbReserved=0;

        //writing directly to the file:
        bmpdata.write((char*)&(bmp.rgbBlue), sizeof(bmp.rgbBlue));
        bmpdata.write((char*)&(bmp.rgbGreen), sizeof(bmp.rgbGreen));
        bmpdata.write((char*)&(bmp.rgbRed), sizeof(bmp.rgbRed));
        bmpdata.write((char*)&(bmp.rgbReserved), sizeof(bmp.rgbReserved));
    }
        for (i=0; i < bmpinfo.biHeight ; i++){
            for (j=0; j < bmpinfo.biWidth; j++){
                bmpdata.write((char*)&bmp, sizeof(bmp));          
            }
        }
    }

    bmpdata.close();
            
    cout << "Size: " << bmpfile.bfSize << "byte" <<
            " Width: " << bmpinfo.biWidth <<
            " Height: " << bmpinfo.biHeight <<
            "\nBitmap created successfully" << endl;
    wait();

    return 1;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.08.2008, 19:03 Uhr
~helferlein
Gast



C++:
bmpinfo.biBitCount = 24;


und dann

C++:
bmpdata.write((char*)&(bmp.rgbBlue), sizeof(bmp.rgbBlue));
bmpdata.write((char*)&(bmp.rgbGreen), sizeof(bmp.rgbGreen));
bmpdata.write((char*)&(bmp.rgbRed), sizeof(bmp.rgbRed));
bmpdata.write((char*)&(bmp.rgbReserved), sizeof(bmp.rgbReserved));


schreibst du 32 bit rein

da ist schonmal ein fehler weil du nur jedes 12te pixel richtig schreibst
und dann noch mehr als im header angegeben.

mach es doch so


C++:
for (unsigned r = 0; r < 255; ++r)
{
    long val = r | (r << 8) | (r << 16);
    bmpdata.write((char*)val, sizeof(val));
}


und 2.

wenn du in der ersten schleife 256 pixel setzt schreibst du mit der zweiten nochmal
256 pixel zu weit

C++:
RGBQUAD bmp;;


da ist noch ein ; zuviel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.08.2008, 17:00 Uhr
~0_saya_0
Gast



Code:
// Bitmap.cpp : Defines the entry point for the console application.
//
#pragma once
  
#include "stdafx.h"
#include <windows.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void wait (){
    std::cin.clear();
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    std::cin.get();
}
int _tmain(int argc, _TCHAR* argv[]){
    
    int i,j;

    ofstream bmpdata("BITMAP.bmp", ios::out|ios::binary); //begin stream
  
    if (!bmpdata) return 1;

    BITMAPFILEHEADER bmpfile;   //Fileheader Data
    bmpfile.bfType = 'MB';
    bmpfile.bfSize = (bmpinfo.biWidth * bmpinfo.biHeight * (bmpinfo.biBitCount / 8)) + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); //aggregate - bmpfile
    bmpfile.bfReserved1 = 0;
    bmpfile.bfReserved2 = 0;
    bmpfile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    BITMAPINFOHEADER bmpinfo; //Infoheader Data
    bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
    bmpinfo.biWidth = 256;
    bmpinfo.biHeight = 256;
    bmpinfo.biPlanes = 1;
    bmpinfo.biBitCount = 24;                                                          
    bmpinfo.biCompression = BI_RGB;
    bmpinfo.biSizeImage = 0;
    bmpinfo.biXPelsPerMeter = 0;
    bmpinfo.biYPelsPerMeter = 0;
    bmpinfo.biClrUsed = 0;
    bmpinfo.biClrImportant = 0;
    
    bmpdata.write((char*)&bmpfile, sizeof(bmpfile));
    bmpdata.write((char*)&bmpinfo, sizeof(bmpinfo));
            
    RGBQUAD bmp;
    bmp.rgbBlue = 255;
    bmp.rgbGreen = 0;
    bmp.rgbRed = 0;

    if(bmpinfo.biBitCount == 24){ //fill image
        for (i=0; i < bmpinfo.biHeight ; i++){
            for (j=0; j < bmpinfo.biWidth; j++){
                bmpdata.write((char*)&bmp, 3);          
            }
        }
    }
            
    bmpdata.close();
    
    cout << "\nBitmap created successfully" << endl;
    wait();
    return 1;
}



Danke für deine Antwort. Der Text oben war leider sehr fehlerhaft. Der größte Fehler war mit 1. das ich "BM" statt MB geschrieben habe und das man erst die bmpfile und dann die bmpinfo in das Bild schreibt. Zudem muss bei der Farbfüllung die sizeof Komponente 3 sein und nicht 4, weil er sonst den reserved Wert mitliest und man nur graustufen bilder mit streifen hinbekommt.

Jetzt klappt aber glücklicherweise alles.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.08.2008, 18:00 Uhr
xXx
Devil


Hm.
(1)RGBQUAD ist einfach die falsche Struktur.
(2) return 1 == RETURN_FAIL
(3) D-tor von std::fstream schließt die Datei selber
(4) C++-Style-Cast s'il vous plaît
(5) Es muss "BM" sein.
(6) #include <stdio.h> u. #include <stdlib.h> können raus
(7) usw.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.08.2008, 20:28 Uhr
~0_saya_0
Gast


Keine Korrektur. RBGQUAD hat sich in RGBTRIPLE geändert. Reserved war mir ein Dorn im Auge. Dadurch richtige Struktur.

(3) Bitte etwas genauer Erläutern
(4) Ebenso bitte erklären
(5) kann ich nicht bestätigen. BM funktioniert nicht, hatte auch manchmal gelesen das sein BM sein muss, aber ebenso oft hab ich gelesen das MB der richtige Wert ist. Letzteres erzeugt eine funktionierende Bitmap.
(6) Danke für die Info
(7) weitere Vorschläge nehme ich gerne entgegen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: