funktion zum lesen und schreiben von pbm's

Hey, ich habe mir jetzt eine Funktion zum lesen und zum schreiben von BItmaps selber geschrieben. Als erstes um das ganze zu testen wollte ich die bitmap öffnen, und anschließen in eine 2te datei das selbe wieder schreiben.

Das problem ist jetzt das, das bild das ich schreibe komplett verzerrt ist, obwohl ich genauso schreibe wie ich zuvor eingelesen habe, ich sitze jetzt hier und habe keine idee mehr wo der fehler liegen könnte.

vielleicht sieht ja einer von euch den fehler...

also hier die lesen funktion:
Code:
int Load_pbm(string filename, int bitmap[402][383], int &Heigth, int &Width)
{
    int x, y;

    char header[2];

    ifstream dat_in;

    dat_in.open(filename.c_str(), ios_base::in);
    if(!dat_in)
    {
        cout<<"Fehler!"<<endl<<endl;
    }

    for(int i = 0; i < 2; ++i)
    {
        dat_in>>header[i];
    }

    dat_in>>x;
    dat_in>>y;

    char matrix[y][x];

    for(int i = 1; i < y+1; ++i)
    {
        for(int j = 1; j < x+1; ++j)
        {
            dat_in>>matrix[i][j];
        }
    }


    for(int i = 1; i < y+1; ++i)
    {
        for(int j = 1; j < x+1; ++j)
        {
            bitmap[i][j] = matrix[i][j];
        }
    }


    dat_in.close();

    Heigth = y;
    Width = x;

    return 0;
}


und die funktion die die bitmap dann wieder schreibt:
Code:
int Save_pbm(string filename, int bitmap[402][383], int Heigth, int Width)
{
    int x, y;

    y = Heigth;
    x = Width;
    char header[2];

    header[0] = 'P';
    header[1] = '1';

    ofstream dat_out;

    dat_out.open(filename.c_str(), ios_base::out);
    if(!dat_out)
    {
        cout<<"Fehler!"<<endl<<endl;
    }

    for(int i = 0; i < 2; ++i)
    {
        dat_out<<header[i];
    }
    dat_out<<endl;

    dat_out<<x;
    dat_out<<" ";
    dat_out<<y;
    dat_out<<endl;


    int count = 1;
    int max = 70;

    for(int i = 1; i < y+1; ++i)
    {
        for(int j = 1; j < x+1; ++j)
        {
            dat_out<<bitmap[i][j];
            if(count == max)
            {
                dat_out<<endl;
                max += 70;
            }
            ++count;
        }
    }

    dat_out.close();

    return 0;
}

da das ganze nach dem lesen und im int speichern nicht mehr die richtige form hat wandle ich noch die 48 und 49 in 0 und 1 um, das aber in der main() funktion....

Code:
int main()
{
    Load_pbm("map.pbm", map, y_map, x_map);

    for(int i = 1; i <= y_map; ++i)
    {
        for(int j = 1; j <= x_map; ++j)
        {
            switch(map[i][j])
            {
                case 48:    map[i][j] = 0;
                            break;
                case 49:    map[i][j] = 1;
                            break;
                default:    break;
            }
        }
    }

    Save_pbm("map2.pbm", map, y_map, x_map);
}

also es kann nicht an der größe der matrix map oder so liegen die sind überall gleich groß ....

hoffe jemand hat die zeit sich das alles mal durchzuschauen und mir vlt den fehler zu zeigen ich bin echt ratlos....
 
Ich hab das jetzt nur mal kurz überflogen, aber in der Beschreibung auf Wikipedia steht, dass zwischen dem Header und den Dimensionsangaben Whitespaces stehen sollten. Die scheinst du weder beim Laden noch beim Schreiben zu beachten.

mfg benediktibk

http://de.wikipedia.org/wiki/Portable_Bitmap
 
ich habe mal mit dem debugger geschaut, und dabei rausgefunden, das in der original datei bis die erste eins kommt 329 nullen stehen, aus irgendeinem grund liest meine funktion aber bis zur ersten 1 484 nullen ein, und schreibt diese dann auch später ... nur warum habe ich bissher nicht rausgefunden ... datei länge ist in der datei die ich schreibe und im original gleich (also die zeilenanzahl und größe in kb).

noch eine information, ich habe einmal ein kleineres bild eingelesen breite: 51 höhe 51, da funktioniert das ohne probleme, das bild mit demi ch es sonst versuche ist 382 breit und 401 hoch ...

ich wäre wirklich über jede hilfe sehr dankbar !!!
 
Zurück
Oben