[C] JPG Bild Byteweise auslesen

Pole17

Grünschnabel
Hallo

Ich möchte ein JPG Bild wie es der Titel schon sagt auslesen. Das Programm soll die komplette Datei auslesen und jedes Zeichen samt der Position als Int Wert in ein Array schreiben.

Jetzt zu meinem Problem. Habe zwar schon den Code Fertig aber je nach Bilddatei findet das Programm ein Zeichen vom wert -1 und Beendet das Programm

Ich Lese die datei mit der Funktion fgetc jedoch ist das ja eine Funktion um Dateien Zeichenweise zu lesen und ich brauche eine Funktion um Dateien Binär zu lesen

vlt kennt ihr eine Lösung
schonmal danke

Code:
#include <stdio.h>
#include <stdlib.h>
#define MATRIXSIZE 999

void hilfe();

int main()
{
    FILE *DATEI, *MATRIX, *CRYPT;
    char fname[255],mname[255]={"matrix.jpg"},cname[255];
    char *ptr;
    int matrixlog[1000][256]={0,},dateic,matrixc,pos;
    int position=2,anzahl=1,i,y,ende;
     
    
        while(1)
         {
             printf("\nWelche Datei wollen sie %cffnen: ",148);
             scanf("%s",&fname);
             
             // wurde ? eingegeben
             if (strcmp(fname, "?" ) == 0 )
                // Anzeigen der Hilfe
                hilfe();
            
             else
             {
                 DATEI=fopen(fname,"r");
                     if (NULL == DATEI)
                     printf("\n *** Konnte datei \"%s\" nicht %cffnen ***\n",fname,148);
                     
                     else
                     break;
             }
         }

    MATRIX=fopen(mname,"r");
        if (NULL == MATRIX)
        printf("\n *** Konnte datei \"%s\" nicht %cffnen ***\n",mname,148);
                    
             
         strcpy(cname,fname);
        
            ptr =strchr(cname,'.');
            *ptr= '\0';
            strcat(cname,"_crypt.txt");
           
    CRYPT=fopen(cname,"w+b");
         if ( NULL == CRYPT)
         {
               printf("\nKonnte datei \"%s\" nicht öffnen\n",cname);
               return EXIT_FAILURE;
         }
 
 
// ********** Anlegen des Hilfsarray`s **********
 
 while (!feof (MATRIX) )
           {
                 matrixc=fgetc(MATRIX);    //auslesen des Zeichens in der Matrix
                 pos++;      // Zählvar für Speicherposition des Zeichens
                 ende=0;
                 i=-1;
                 
                 while (ende!=1)     
                          {
                                    
                                       
                              i++;
                              if (i == MATRIXSIZE && matrixlog[0][i] != matrixc)  //matrixlog[zeichen][vorkommen][position]
                              {
                               
                               y=0;
                               
                               
                               while (matrixlog[0][y] != 0) // Position auf freies feld setzen
                               y++;
                                         
                               matrixlog[0][y]=matrixc;   //matrixc in freien bereich schreiben
                             
                               matrixlog[1][y]=anzahl;// anzahl der Variablen
                                 
                                while (matrixlog[position][y] != 0) // Position auf freies feld setzen
                                      position++;
                                
                                matrixlog[position][y]=pos; // position in freies feld schreiben
                                position=2;// Zurücksetzen auf standart feld für die Position des Zeichens
                               printf("\nZEICHEN: %d  %x ANZAHL: %d    ",matrixlog[0][y],matrixlog[0][y],matrixlog[1][y]);
                               printf(",%d,",pos);  
                               //printf("zeichen: %d anzahl: %d position: %d\n",matrixlog[0][y],matrixlog[1][y],matrixlog[position][y]);
                               ende=1;
                               
                              }
                                          
                    else if (matrixlog[0][i] == matrixc)  //Wenn Zeichen in array vorhanden
                          {
                               matrixlog[1][i]+=1;            // anzahl des Zeichens um 1 erhöhen
                               anzahl=1;
                              
                               while (matrixlog[position][i] != 0) // Position auf freies feld setzen
                               
                               position++; // Solange Hochzählen bis leeres feld gefunden
                               
                                  matrixlog[position][i]=pos; // position in freies feld schreiben
                                  position=2;// Zurücksetzen auf standart feld für die Position des Zeichens
                          ende=1;
                          }  
                    }// for schleife
           
           }//while (!feof (MATRIX) )
 getch();
 // ********** Anlegen des Hilfsarray`s  -ENDE- **********
 
 }// MAIN END
 
 // wird aufgerufen wenn "?" eingegeben wird 


void hilfe()
{
    

printf("\n\n\t\t\t********** HILFE **********\n\n");
printf("Syntax: crypt [Dateipfad] [Matrixpfad]\n\t\n");
printf("Beispiel crypt C:\\kunden.dat C:\\matrix.jpeg\n\n\t");
printf("Parameter 1: Pfad der Datei die Verschlüsselt werden soll\n\t");
printf("Parameter 2: Pfad der Ver- Entsclüsselungsmatrix\n\n");   


}

Braucht nur eine Bild Datei "matrix.jpg" und noch eine datei wo irgendein text drinsteht dann zeigt das Programm alles an was es in der "matrix.jpg" gefunden hat

"Zeichen: [int wert des Zeichens] [Hexwert des Zeichens ] [Anzahl] [Position in der Bilddatei]

Bei dem Bild welches ich als Link angegeben habe stoppt das Programm bei Position 77 mit dem Oben angegebenen Fehler

Beispiel bild
http://vividlight.deviantart.com/art/Hello-It-s-Me-129666416
 

Anhänge

  • d.txt
    52 Bytes · Aufrufe: 89
Hallo Pole17,

du musst bei fopen den Mode "rb" (binär lesen) verwenden und statt fgetc nimmst fread.

Gruß
MCoder
 
Hallo Pole17,

du musst bei fopen den Mode "rb" (binär lesen) verwenden und statt fgetc nimmst fread.

Gruß
MCoder

Danke für die schnelle Antwort.


Das mit dem rb hat funktioniert danke

aber das mit dem fread nicht ganz wenn ich es über fread schreibe dann stürzt das programm ab und wenn ich es weiter mit fgetc mach stürzt das Programm erst nach einer bestimmten zeit ab

Wenn ich MATRIXSIZE erhöhe läuft das Programm länger

Code:
int buffer[1];

fread(&buffer,sizeof(int),,MATRIX);

und dann bei den Abfragen
Code:
if (i == MATRIXSIZE && matrixlog[0][i] != buffer[1])

matrixlog[0][y]=buffer[1]; 

 else if (matrixlog[0][i] == buffer[1])
 
Du musst beim Lesen aufpassen: Ein int sind (in der Regel) 4 Byte. Ich weiss nicht, ob das in deinem Sinne ist, auf einmal diese 4 Bytes zu holen.
Zeichenweises Einlessen sollte so funktionieren:
C:
char c;
fread(&c, sizeof(char), 1, MATRIX);
Gruß
MCoder
 
danke nochmal für die Antwort

Hab das Problem aber gefunden. Es lag nicht an fgetc oder fread :)

Das Problem lag darin, dass ich vom Kompiler nicht genügend speicherpaltz für mein array bekommen habe und das Programm dann übergelaufen ist.

hab die Schleife einfach begrenzt, da für meine zwecke die Anzahl der Katalogiesierten Daten ausreichen.


Ich nutze DevC++ weis vlt jemand wo ich nachsehen kann wieviel speicher ich für Variablen zur Verfügung habe oder ich vieleicht sogar die Parameter dafür ändern kann.


Hab fgetc weiterverwendet das Funktioniert auch
 
Ich nutze DevC++ weis vlt jemand wo ich nachsehen kann wieviel speicher ich für Variablen zur Verfügung habe oder ich vieleicht sogar die Parameter dafür ändern kann.
Wenn du die Variablen auf dem Stack anlegst, dann wird der Speicher natürlich von der Stackgröße limitiert.

Die Größe des Stacks ist vom Betriebssystem abhängig. Unter Windows ist diese standardmäßig auf 1024 kByte limitiert.

Größere Variablen solltest du sowieso lieber auf dem Freispeicher (Heap) anlegen.

Gruß
 

Neue Beiträge

Zurück