Salve,
sto cercando di fare una classe in C++ per trattare immagini. Tale classe ha 5 attributi privati:
- Type: identifica il tipo di immagine
- Row: identifica il numero di righe dell'immagine
- Col: identifica il numero di colonne
- Maxval: identifica il valore massimo di ciascun pixel (solitamente 255)
- Data: è un array (o meglio un puntatore ad array) che contiene i livelli di grigio di ciascun pixel
Di seguito posto i tre file (il file .h per l'header della classe, il file .cpp per la classe ed il file .cpp per testare la classe)
codice:
//File MyImage.h
#ifndef MYIMAGE_H#define MYIMAGE_H
#include <sstream>
using namespace std;
class MyImage
{
string type;
int row;
int col;
int maxval;
int* data;
public:
MyImage();
MyImage(int r, int c);
MyImage(string nomefile);
~MyImage();
bool Open(string nomefile);
bool Save(string nomefile);
};
#endif
codice:
//File MyImage.cpp
#include "MyImage.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
MyImage::MyImage() {
}
MyImage::MyImage(int r, int c) {
row = r;
col = c;
}
MyImage::MyImage(string nomefile) {
type = nomefile;
}
MyImage::~MyImage() {
delete data;
}
bool MyImage::Open(string nomefile) {
ifstream image(nomefile.c_str());
image>>type;
image>>col;
image>>row;
image>>maxval;
int pixel[col*row];
for (int i=0; i<col*row; i++)
{
int num;
image>>num;
pixel[i] = num;
}
data=pixel;
image.close();
return true;
}
bool MyImage::Save(string nomefile) {
ofstream image(nomefile.c_str());
image<<type<<endl;
image<<col<<endl;
image<<row<<endl;
image<<maxval<<endl;
for (int i=0; i<col*row; i++)
{
int num = data[i];
image<<num<<endl;
}
image.close();
return true;
}
codice:
#include "MyImage.h"
#include <iostream>
#include <fstream>
using namespace std;
int main() {
MyImage a;
a.Open("im0.pgm");
a.Save("im.pgm");
return(0);
}
Il problema è essenzialmente con l'attributo "data" che, come detto, dovrebbe essere un puntatore ad un array. Infatti quando nel main provo la classe (per ora carico un'immagine e la salvo con un'altro nome) durante il metodo Open "data" contiene i valori esatti mentre durante il metodo Save "data" contiene valori del tutto sballati... come se nel metodo precedente venisse cancellato ciò che era stato salvato nell'attributo.
Qualcuno saprebbe aiutarmi?
PS: spero che nel codice non ci sia troppa spazzatura... infatti la devo ancora sistemare e potrebbero esserci scritte cose strane in mezzo XD