从vector <unsigned char>写入PGM文件

问题描述

我正在编写一个程序来处理pgm文件方法获取输入的pgm,将数据存储在vector<unsigned char>中,使用数据向量创建新的向量,依此类推,直到我使用最后一个向量以创建输出pgm文件

我每次都迈出了一步,从获取输入pgm并将数据放入vector<unsigned char>开始,然后获取原始矢量并将其输出到新的pgm文件中。基本上,将输入复制到新文件中。它不起作用,我不确定为什么。

这是我的代码

//note: int degree is for after I start manipulating the data and dimensions will change
void outputFile(vector<unsigned char> image,int degree,int original_r,int original_c){
FILE* pgmimg;
pgmimg = fopen("pgmimg.pgm","wb");
int temp;

int width = static_cast<int>(original_c / (pow(2,degree)));
int height = static_cast<int>(original_r / (pow(2,degree)));

fprintf(pgmimg,"P2\n");
fprintf(pgmimg,"%d %d\n",width,height);
fprintf(pgmimg,"255\n");

for (int i = 0; i < height; i++){
    for (int k = 0; k < width; k++){
        temp = image[(i*width)+k];
        
        fprintf(pgmimg,"%d ",temp);
    }
    fprintf(pgmimg,"\n");
}
fclose(pgmimg);}

int main(){
// PATH_NAME is a string defined at the beginning of the code set to the path to the input image
fstream img;
img.open(PATH_NAME,ios::in | ios::binary | ios::out);

string line;
getline(img,line);
if(!img.is_open()){
    cout << "Unable to open image" << endl;
    return 0;
}
if(!line.compare("P2")){
    cout << "Incorrect file format" << endl;
    return 0;
}

getline(img,line);
istringstream iss(line);
string row_string,col_string;
iss >> col_string;
iss >> row_string;

int original_rows = stoi(row_string);
int original_cols = stoi(col_string);

cout << original_rows << " " << original_cols << endl;
getline(img,line); //get max value

//collect data from input
int length = img.tellg();
char* buffer = new char [length];
img.read (buffer,length);
//copy data into original
vector<unsigned char> original(original_rows*original_cols);
for(int i = 0; i < original.size(); i++){
    original[i] = buffer[i];
}
outputFile(original,original_rows,original_cols);
img.close();
return 0;
}

这就是我要输入的内容(StackOverflow不允许我放置pgm,所以这是PNG版本):

input

这是“ pgmimg.pgm”中输出内容

output

很显然,这是完全错误的(正确的尺寸,其他所有错误)。有人可以帮助我或让我知道在读取输入或写入输出时遇到问题吗?谢谢。

解决方法

输入代码看起来不正确

int length = img.tellg();
char* buffer = new char [length];
img.read (buffer,length);

tellg是文件中的当前位置。这与剩余要读取的数据量无关。只需将数据直接读入向量

vector<unsigned char> original(original_rows*original_cols);
img.read(original.data(),original.size());