2017-02-17 1 views
1

P6lecture des images au format PPM

P6 indique qu'il est une image PPM. Les deux champs suivants sont la largeur et la hauteur de l'image. Le dernier champ donne la valeur de pixel maximale. A la fin de l'en-tête est un \ n puis les données de pixels binaires. L'image est en couleur donc il y a trois octets (rouge, vert, bleu). Le but de ma fonction readPPM est de retourner les données de pixels dans un tableau unidimensionnel de caractères non signés, plus la largeur et la hauteur de l'image. Le but de ma fonction writePPM (je n'ai encore rien fait pour cette fonction) est d'écrire l'image au format PPM dans un fichier vide à partir des informations fournies par ma fonction readPPM. Je ne suis toujours pas sûr de savoir comment faire fonctionner ce programme, donc je ne stocke pas le 650 en largeur et 652 en hauteur. Je vais m'inquiéter à ce sujet une fois que je pourrai lire et écrire les fichiers texte.

Mise à jour: J'ai réussi à stocker l'en-tête (P6, 650, 652 et 255)) dans leurs bonnes variables (je sais parce que j'ai essayé d'imprimer leurs valeurs et ils sont sortis à droite). Ma sortie est montrée ci-dessous. Je me demandais ce que ces caractères absurdes en dessous du maximum étaient. Sont-ce les données de pixel binaire? Si oui, alors j'ai juste besoin d'écrire ma fonction writePPM.

sortie: PSix: P6

Largeur: 650

Hauteur: 652

maximale:?????? 255

ɡ ƞ ɢ ˤ ɢ de S? ĝ? Ǡ? ʤ? ɣ? ɡ? ɡ? ǟ? Ĝ? ŝ? Ƞ? ȡ? ʣ? ʣ? ȡ? ʣ? ʣ? ȡ? Ŝ? Ŝ? Ȟ? ʠ? ̤? ƞ? Ơ? ʤ? ʦ? ʦ? ɧ? Ƥ? Ǥ? Ȧ? Ɩ? ʪ? ʫ? ʫ? ʪ? ʨ? ɤ? Ǡ? ʢ? ̤? ȡ? ȡ? ʥ? Ɥ? ʧ? Ģ? Ǥ? Ƥ? Ģ? Ƥ? ʨ? ʨ? ɧ? ʨ? ɧ? ɧ? ͨ? Ϧ? ʟ? ˠ? Х? Φ? ͥ? ˣ? Ǟ? ʦ? ʦ? Ɥ? Ġ ??? ?????????? ?? ˭? ū ?????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? յ? Ǫ? ٿ? һ ???? ư? ɳ? ɳ? ɱ? ɱ? ˰? ˮ? ɪ? Ȧ? ͫ? ֵ? ұ? Ť? ¡? ʩ? Ӳ? Ϯ? ͫ? ϭ ? ѯ? ѯ? Ϭ? ̭? ˰? Ͷ? ͵? ˳? ʱ? ͵? ˳? ʱ? Ǯ? ȯ? ε? ӷ? ϳ? ̯? ɬ? ̫? ͬ? ͭ? ˪? ΰ? ͮ? ί? Ӵ? Ӷ ? ς? ˮ? ɬ? ʭ? Ѵ? ҵ? г? ς? ˮ? ȫ? ɬ? ǩ? ρ? ρ? в? в? ʬ? ˭? ̭? ί? ͮ? ͮ? ͮ? ί? ˬ? ȩ ? ʫ? ͮ? ղ? ү? Ӳ? ֵ? Ҵ? ѳ? ς? ȭ? ȭ? ˰? ˮ? ˮ? ˰? ˮ? ˮ? ͯ? ̮? ̬? ͯ? ˮ?? ˲? ȯ? ƭ? Ư? Ů ? ®? ¯ ???????????????????????? é? É? Ū? ¨ ???????????????????????????????????????????????????? ?? ȫ? ɫ? ̭? ˭? ʬ? ʬ? ɫ? ʬ? ʮ? ˯? ˯? ˯? ˯? Ȭ? Ȫ? ɫ? ̮? ͯ? ρ? ѳ? ӵ? Ѵ? б? κ? ϭ? ά? Ѯ? Ա? Ӱ? Э? Ϭ? ү? ү? Э? ά? ѯ? וי? ӭ? ϩ? ͧ? ϧ? ѩ? Ԭ? ذ? խ? ѩ? Ϧ? Ϧ? Ч? ҩ? ҩ? ҩ? ת? ث? ׭? خ? ׯ? 7? Կ? Կ? Ԭ? Խ? ج? ج? ܬ? ߰? 㳩 䴨 峨 ݫ? 7? ެ 䲧 峨 峨 䲧 س ج ج جمي ??? ????????????????????????????? ± ???? ð ???????? ???????????????????????????????? æ? ũ? ç? é? Ī ? ë ??????? £? Ʀ? Ʀ? ƥ? Ť ? Ť? Ƥ? ɧ? ʨ? ͫ? Ά? ʩ? Ť??? Ţ? Ť? Ť? Ƨ? ˬ? ɭ? ????????????????? ????????????? ç ????????????????????????????????? ???????????????????????????????????????????? ???????????????????????? ?????????? ?????? ????????????????????????????????????? ?????? ??? ???????  겱 겱 겳 겳 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫 뵫                   㳩 ᱧ 㳧 嵩 㵨 ᳦᳤ჵ 乩 缬 轭 轭 缬 ߴ? 0? ߴ? 幬

main.cc

int main() { 

char fileName[50] = "binary_pixels.txt"; 
int width = 0; // width of the image 
int height = 0; // heigt of the image 
int size = 128; // size of the array 

// read the PPM file and store its contents inside an array and return 
// the pointer to that array to pixelArray 
unsigned char* pixelArray[size] = readPPM(fileName, &width, &height); 

// print the contents of the array 
for (int i = 0; i < 128; i++) { 
    printf("%s\n", pixelArray[i]); 
} // end of for loop 

} // end of main 

readPPM.cc

unsigned char readPPM(const char* fileName, char* pSix, int* width,   
int* height, int* maximum) { 

// open the file to read just the header reading 
FILE* fr = fopen(fileName, "r"); 

// formatted read of header 
fscanf(fr, "%s", pSix); 

// check to see if it's a PPM image file 
if (strncmp(pSix, "p6" , 10) != 0) { 
    printf("They are not the same\n"); 
} else { 
    printf("They are the same\n"); 
} 

// read the rest of header 
fscanf(fr, "%d\n %d\n", width, height); 

fscanf(fr, "%d\n", maximum); 

// check to see if they were stored properly 
printf("PSix: %s\n", pSix); 
printf("Width: %d\n", *width); 
printf("Height: %d\n", *height); 
printf("maximum: %d\n", *maximum); 

// allocate array for pixels 
unsigned char* pixels = new unsigned char[width * height]; 

// unformatted read of binary pixel data 
while (fread(pixels, sizeof(pixel), 128, fr)) { 
    printf("%s", pixels); 
} // end of for loop 

// close file 
fclose(fr); 

// return the array 
return pixels; 

} // end of readPPM 
+2

Si votre programme doit être un code c propre, vous ne pouvez pas utiliser 'new'. En C c'est fait avec 'malloc()' (include 'stdlib.h'). – Scheff

+0

Le type de 'pixelArray' dans' main' est incorrect. Il doit être 'unsigned char * pixelArray' (sans [size]'). – Scheff

+0

J'ai réussi à stocker l'en-tête (P6, 650, 652 et 255)) dans leurs bonnes variables (je sais parce que j'ai essayé d'imprimer leurs valeurs et ils sont sortis à droite). Ma sortie est montrée ci-dessous. Je me demandais ce que ces caractères absurdes en dessous du maximum étaient. Sont-ce les données de pixel binaire? Si oui, alors j'ai juste besoin d'écrire ma fonction writePPM. – asilvester635

Répondre

0
//struct to hold a pixel. 
struct rgb 
{ 
    char r; 
    char g; 
    char b; 
}; 

//struct to hold the image and its info. 
struct image 
{ 
    char p; 
    int format; 
    int width; 
    int height; 
    int intensity; 
    //struct rgb **rgb; 
    unsigned char *pixels; 
}; 

int main(void) 
{ 
    struct image m; 
    FILE *fp = //fopen(...); 

    fscanf(fp, "%c%d\n", &m.p, &m.format); 

    fscanf(fp, "%d %d\n", &m.width, &m.height); 

    fscanf(fp, "%d\n", &m.intensity); 

    printf("%c%d\n", m.p, m.format); 
    printf("%d %d\n", m.width, m.height); 
    printf("%d\n", m.intensity); 

    //allocate array to hold the pixels 
    m.pixel = (unsigned char*)malloc(m.width*m.heigth*3*sizeof(unsigned char)); 

    //read pixels into m.pixel 
    return 0; 
} 
+0

J'ai réussi à stocker l'en-tête (P6, 650, 652 et 255)) dans leurs bonnes variables (je sais parce que j'ai essayé imprimer leurs valeurs et ils sont sortis à droite). Ma sortie est montrée ci-dessous. Je me demandais ce que ces caractères absurdes en dessous du maximum étaient. Sont-ce les données de pixel binaire? Si oui, alors j'ai juste besoin d'écrire ma fonction writePPM. J'ai également mis à jour mon code. – asilvester635

0

Vous êtes pas lire l'omble chevalier dans l'emplacement correct.pixels est déjà un pointeur vers char s de sorte que vous devriez passer comme est à fscanf:

fscanf(fr, "%c", pixels) 

Bien sûr, il y a d'autres questions, mais je cela devrait vous laisser passer ce barrage routier.

+0

J'ai réussi à stocker l'en-tête (P6, 650, 652 et 255)) dans leurs bonnes variables (je sais parce que j'ai essayé d'imprimer leurs valeurs et ils sont sortis à droite). Ma sortie est montrée ci-dessous. Je me demandais ce que ces caractères absurdes en dessous du maximum étaient. Sont-ce les données de pixel binaire? Si oui, alors j'ai juste besoin d'écrire ma fonction writePPM. J'ai également mis à jour mon code. – asilvester635

+0

Lorsque vous trouvez une réponse à votre question, vous devez la fermer en choisissant la bonne réponse - en la publiant vous-même si nécessaire - et fermer la question. * Pas * changer la question. – kmkaplan