Lecture/Écriture de PPM Fichier Image de C++
Essayer de lire et d'écrire à partir d'un PPM de fichier Image (.ppm) dans la seule façon que je sais comment:
std::istream& operator >>(std::istream &inputStream, PPMObject &other)
{
inputStream.seekg(0, ios::end);
int size = inputStream.tellg();
inputStream.seekg(0, ios::beg);
other.m_Ptr = new char[size];
while (inputStream >> other.m_Ptr >> other.width >> other.height >> other.maxColVal)
{
other.magicNum = (string) other.m_Ptr;
}
return inputStream;
}
Mes valeurs correspondent à la taille réelle du fichier. J'ai donc allègrement tentative d'écrire les données:
std::ostream& operator <<(std::ostream &outputStream, const PPMObject &other)
{
outputStream << "P6" << " "
<< other.width << " "
<< other.height << " "
<< other.maxColVal << " "
;
outputStream << other.m_Ptr;
return outputStream;
}
Je fais assurez-vous d'ouvrir le fichier en utilisant std::ios::binary pour la lecture et l'écriture:
int main ()
{
PPMObject ppmObject = PPMObject();
std::ifstream image;
std::ofstream outFile;
image.open("C:\\Desktop\\PPMImage.ppm", std::ios::binary);
image >> ppmObject;
image.clear();
image.close();
outFile.open("C:\\Desktop\\NewImage.ppm", std::ios::binary);
outFile << ppmObject;
outFile.clear();
outFile.close();
return 0;
}
Erreur De Logique:
Je ne suis qu'un écrit une partie de l'image. Il n'y a pas de problème avec l'en-tête ou d'ouvrir le fichier manuellement.
Publique de la classe des variables membres:
La m_Ptr variable de membre de est un char * et la hauteur, la largeur maxColrVal sont tous les nombres entiers.
Tentative De Solution:
À l'aide de inputStream.lire et outputStream.écrire pour lire et écrire des données, mais je ne sais pas comment et ce que j'ai essayé ne fonctionne pas.
Depuis mon char * m_Ptr contient toutes les données de pixels. Je peut itérer dessus:
for (int I = 0; I < other.width * other.height; I++) outputStream << other.m_Ptr[I];
Mais cela provoque une erreur d'exécution pour une raison quelconque..
OriginalL'auteur user4640007 | 2015-03-06
Vous devez vous connecter pour publier un commentaire.
Basé sur http://fr.wikipedia.org/wiki/Portable_pixmap, P6 est une image binaire.
Cela se lit d'une seule image. Notez qu'aucune vérification n'est effectuée. Ce qui doit être ajouté.
Ce code écrit en une seule image.
m_Ptr ne contient que les valeurs de pixels RVB.
J'ai testé le code sur une image que j'ai téléchargé à partir du web (http://igm.univ-mlv.fr/~incerti/IMAGES/COULEUR/Aérien.512.ppm) et en utilisant la structure suivante PPMObject il a travaillé.
Il est déclaré comme une chaîne de caractères ? Il devrait parce que nous voulons lire "P6".
Oui, c'est std::string
Si c'est un Entier, le compilateur est heureux. Mais rien n'est lu dans les variables de membre.
C'est normal parce que le fichier commence par la chaîne "P6". Avez-vous affiché à la tête de la file ?
OriginalL'auteur chmike