2012-10-26 204 views
0

我正在寫一個簡單的程序來將灰度二進制(P5)轉換爲灰度ascii(P2),但是在讀取二進制文件時遇到困難並將其轉換整數C++將二進制(P5)圖像轉換爲ascii(P2)圖像(.pgm)

#include <iostream> 
#include <fstream> 
#include <sstream> 
using namespace::std; 

int usage(char* arg) { 
// exit program 
    cout << arg << ": Error" << endl; 
    return -1; 
} 

int main(int argc, char* argv[]) { 
    int rows, cols, size, greylevels; 
    string filetype; 

    // open stream in binary mode 
    ifstream istr(argv[1], ios::in | ios::binary); 
    if(istr.fail()) return usage(argv[1]); 

    // parse header 
    istr >> filetype >> rows >> cols >> greylevels; 
    size = rows * cols; 

    // check data 
    cout << "filetype: " << filetype << endl; 
    cout << "rows: " << rows << endl; 
    cout << "cols: " << cols << endl; 
    cout << "greylevels: " << greylevels << endl; 
    cout << "size: " << size << endl; 

    // parse data values 
    int* data = new int[size]; 
    int fail_tracker = 0; // find which pixel failing on 
    for(int* ptr = data; ptr < data+size; ptr++) { 
     char t_ch; 
     // read in binary char 
     istr.read(&t_ch, sizeof(char)); 
     // convert to integer 
     int t_data = static_cast<int>(t_ch); 
     // check if legal pixel 
     if(t_data < 0 || t_data > greylevels) { 
      cout << "Failed on pixel: " << fail_tracker << endl; 
      cout << "Pixel value: " << t_data << endl; 
      return usage(argv[1]); 
     } 
     // if passes add value to data array 
     *ptr = t_data; 
     fail_tracker++; 
    } 
    // close the stream 
    istr.close(); 

    // write a new P2 binary ascii image 
    ofstream ostr("greyscale_ascii_version.pgm"); 
    // write header 
    ostr << "P2 " << rows << cols << greylevels << endl; 
    // write data 
    int line_ctr = 0; 
    for(int* ptr = data; ptr < data+size; ptr++) { 
     // print pixel value 
     ostr << *ptr << " "; 
     // endl every ~20 pixels for some readability 
     if(++line_ctr % 20 == 0) ostr << endl; 
    } 
    ostr.close(); 

    // clean up 
    delete [] data; 
    return 0; 
} 

sample image - 從一箇舊的職位拉了這個。刪除了圖片文件中的註釋,因爲我現在不擔心這個功能。

當使用g ++編譯,我得到的輸出:

$> ./a.out a.pgm 
filetype: P5 
rows: 1024 
cols: 768 
greylevels: 255 
size: 786432 
Failed on pixel: 1 
Pixel value: -110 
a.pgm: Error 

的形象是一隻小鴨子,有沒有辦法像素值可以是-110 ...我要去哪裏錯了? 謝謝。

回答

2

greylevels:255

-110是146爲unsigned char。看來你在一個平臺上,char是一個有符號的類型,嘗試使用unsigned char。

+0

changed「istr.read(&t_ch,sizeof(char));」到「unsigned char t_ch = istr.get();」並保持一切都一樣,它的工作完美。謝謝。 – tubby

0

如果不能有負值,請使用unsigned int *而不是int*作爲像素指針。這樣你就不必讀取值有符號數

+0

你會怎麼雙做到這一點?在我編寫的主程序中,我將值讀入需要查找stdev,mean ect的類中。進行計算。我試着改變t_data並且把類型轉換爲unsigned int,程序在像素1上失敗:「pixel value:4294967186」 – tubby

0

你需要輸出的修正:

ostr << "P2\n" << rows << " "<< cols << " "<< greylevels << endl; 
相關問題