Bitmappixel auslesen - die Zweite :-/



  • Also ich hab ja was geschrieben, das mir nen 8bit grayscale Bild ausliest und die Daten in ne Datei schreibt. Hat sogar richtig gut geklappt, bis ich mal etwa größere Bilder(über 128*128) genommen habe.
    😞
    Dann hat er zB die letzten Pixel weggelassen oder so, also ich kapier selbst nicht so richtig, was genau da der jetzt macht. Es sind ja so viele Pixel 🙄
    Hier die Funktion zum Laden:

    if (OpenDialog1->Execute()) Image1->Picture->LoadFromFile(OpenDialog1->FileName);
    

    Und hier zum Auslesen und speichern:

    Byte *ptr,*all;
     all=new Byte[Image1->Picture->Width*Image1->Picture->Height];
    
     FILE  *rawdatei;
     rawdatei=fopen("field.raw","wb");
     for (int i=0;i<Image1->Picture->Height;i++)
         {
              ptr=(Byte *)Image1->Picture->Bitmap->ScanLine[i];
              for (int j=0;j<Image1->Picture->Width;j++)
              {
                  Memo1->Lines->Add(ptr[j]);         //Zum kontrollieren
                  all[i*Image1->Picture->Width+j]=ptr[j];
              }
         }
     fwrite(all,sizeof(byte),Image1->Picture->Height*Image1->Picture->Width,rawdatei);
     fclose(rawdatei);
    

    Also wie gesagt, ich weiß selbst nicht, was er dann genau falsch macht. Aber irgendwie stimmts dann vorne und hinten nicht mehr (im Memo). 😕

    Wäre toll, wenn mir mal jemand zeigt, wies richtig geht.
    Vielen Dank



  • Jetzt lasst mich doch nicht einfach so hängen 😞

    Mit dem bisschen Quellcode kann ich doch keinen erschlagen haben? 😮

    Oder woran liegts, dass keiner was sagt 😕



  • Nu mal sachte!

    Vielleicht hat keiner ne Ahnung was Du willst?

    Du schreibst die Grauwerte aller Pixel in ne Datei - richtig?
    Bis 128x128 Pixel geht's - richtig?

    ??? Wieviel Byte hat die datei dabei ???

    Bei groesseren klappt's nicht - was genau???

    Mach mal mit nem 256x256 Pixel- Bild. Wie gross wird die Datei???

    .
    .
    .

    Du musst schon etwas praeziser fragen, wenn Du Hilfe willst.

    PS: Mach mal vor fclose(rawdatei) ein fflush(rawdatei)

    Warum speicherst Du nicht einfach das Bild aus Image1 ???



  • Nun also, dann drücke ich mich halt genauer aus 🕶

    Wobei die Frage, wie groß die Datei wird, sich erübrigen müsste, da sie immer
    sizeof(byte)*Image1->Picture->Height*Image1->Picture->Width groß wird. Also ist die Datei immer so groß, wie sie auch sein sollte! 😮

    Und da ich die Fehler ja schon im Memo habe, ist das Datei speichern eh unrelevant, ich habs nur der Vollständigkeit halber dazu getan. 🙂

    Also es ist nicht dass Dateischreiben, dass nicht geht, sondern irgendwo dazwischen muss es hapern. Da ich ja alle ausgelesenen Werte im Memo überprüfen kann, sehe ich auch, dass diese bei größeren Bildern (sogar schon ab 96) besonders am Ende nicht mehr mit denen auf dem Bild übereinstimmen. 😕

    Beispiel: Ich hab nen schwarzes 256*256 bild mit einem weißen Pixel unten rechts. Der müsste jetzt ganz unten am Memo stehen, da steht aber nix. Wär das Bild jetzt 64*64 würde da brav 255 stehen 🙂

    Ich hoffejetzt ahbt ihr es verstanden? Ich kanns auch noch genauer erklären. Aber mit den paar Codezeilen kannst man es ja auch mal selbst versuchen, dann könnt irh vieleicht auch den Fehler reporduzieren. Wenn nicht, lliegts wohl irgendwie an meinem PC oder so 😞

    Ich speicher das ganze nicht wieder als Bild, weil ich keine header und so brauche, nur die reinen Werte.
    Und ohne VCL nen Bitmap laden ist auch nicht so der Spaß 😃



  • isses nicht einfacher ein zweidimensionales array anzulegen, anstatt krampfhaft zu versuchen alles in eins zu quetschen? ist doch viel übersichtlicher? nicht zu vergessen all nach dem speichern wieder frei zu geben.



  • Original erstellt von Sunday:
    isses nicht einfacher ein zweidimensionales array anzulegen, anstatt krampfhaft zu versuchen alles in eins zu quetschen? ist doch viel übersichtlicher? nicht zu vergessen all nach dem speichern wieder frei zu geben.

    Wenn man sich daran gewöhnt hat geht es schon, krampfhaft würde ich es jetzt nicht nennen 🙂

    Nur leider hilft es mir so oder so nicht bei der Lösung des Problems 😞



  • @Luftgeist

    Also die Datei hat immer die richtige Groesse. Ok

    mach mal fuer's Memo:

    Memo1->Lines->Add(AnsiString(j+i*Image1->Picture->Width)+ ". "+ptr[j]);

    Dann sind die 'Pixelwerte' nummeriert!

    Welche Nummern fehlen in Deinem Memo danach???

    Kann es sein, dass Dein Memo nicht so viel speichern kann? Was fuer BCB haste?

    PS: Bei mir geht Dein Code auch bei 250 x 350 er Bild! (BCB 4.0)



  • Das mit dem Zählen war ne clevere Idee 😃
    Bei 100*100 kam der nur bis 27xx, das Memo ist (ich hab jetzt nachgeschaut 32kb) zu klein :o
    Hab jetzt nen Richedit Feld genommen, funzt perfekt... jetzt kann ich mich endlich richtig um den Rest kümmern, der hat anscheinend noch ein paar kleine Probleme beim schreiben bzw wiederladen des Raws 🕶

    Vielen Dank für die Hilfe 🙂


Anmelden zum Antworten