2017-03-01 1 views
0

J'essaie d'écrire un programme pour lire des images en ppm, les stocker comme des objets et les réécrire. Idéalement, je voudrais stocker les pixels comme des objets de type int, mais je ne peux obtenir que des images similaires avec des caractères. Malheureusement, même en utilisant des objets char, il en résulte une version grisée de l'image. Je ne suis pas sûr pourquoi la modification du type de stockage entraîne un changement si important, ou pourquoi les couleurs de l'image sont perdues lorsque la forme est conservée.Lecture/écriture en C++ de fichiers d'image PPM en train d'effacer l'image

J'ai essayé de parcourir la myriade d'autres questions du programme ppm ici, mais je ne peux pas faire la tête ou la queue de leurs réponses (ou si elles sont même pertinentes). Je ne suis pas familier avec cette langue et je n'ai aucune idée de ce qui pourrait se passer.

Si quelqu'un pouvait expliquer ce que je fais de mal, et les stratégies que je pourrais utiliser pour stocker les données au format int au lieu de char, je serais extrêmement reconnaissant. Ci-dessous le code de lecture et d'écriture de fichier pour ma classe ppm, ma fonction principale initialise juste un objet ppm, appelle readfile(), puis appelle writefile(). Quelque part, il ne parvient pas à préserver l'image.

void PPM::readFile(std::string filename) 
{ 
    std::ifstream file; 
    std::string stuff; 
    char junk; 
    file.open(filename, std::ios::binary); 
    file >> stuff >> width >> height >> maxCol; 
    file >> std::noskipws >> junk; 
    int i = 0; 
    char r, g, b; 
    std::cout << width*height; 
    while (i < width*height) 
    { 
     file.read(&r, 1); 
     file.read(&g, 1); 
     file.read(&b, 1); 
     red.push_back(b); 
     grn.push_back(b); 
     blu.push_back(b); 
     i++; 
     std::cout << i << std::endl; 
    } 
} 

void PPM::writeFile(std::string filename) const 
{ 
    std::ofstream file; 
    file.open(filename, std::ios::binary); 
    file << "P6 " << width << " " << height << " " << maxCol << std::endl; 
    int i = 0; 
    std::cout << width << " " << height; 
    while (i < width*height) 
    { 
     file.write(&red[i], sizeof(red[i])); 
     file.write(&grn[i], sizeof(grn[i])); 
     file.write(&blu[i], sizeof(blu[i])); 
     std::cout << "iteration " << i << std::endl; 
     i++; 
    } 
} 

Merci encore pour toute aide que vous pouvez donner

+0

Qu'est-ce que 'red',' green' et 'blu'? –

Répondre

1
red.push_back(b); 
grn.push_back(b); 
blu.push_back(b); 

C'est le bug. Vous devez repousser r, g et b respectivement. Changez également char en int, il est plus sûr de cette façon, comme indiqué dans les commentaires ci-dessous.

+1

Un autre bug est qu'il ne vérifie pas maxCol. Selon [PPM spec] (http://netpbm.sourceforge.net/doc/ppm.html), si maxCol> 255, il y a 2 octets par canal de couleur. Donc, dans ce cas, r, g, b devrait être de type 'uint16_t'. – zett42

+0

Le programme suppose que les canaux de couleur sont définis sur 255 ou moins, donc je n'ai pas vraiment de protection en place pour l'appliquer. Je vais probablement les ajouter plus tard, et merci de me parler du type unit16_t! – Forstrei