Обработка изображений в C ++ - PullRequest
0 голосов
/ 11 сентября 2011

Я открываю файл 3,5 МБ на C, читая его в массиве без знака. Данные изображения, которые я инициализировал следующим образом:

unsigned char *** Imagedata;
Imagedata = new unsigned char**[1278];
for(int i=0; i<1278; i++){
    Imagedata[i]= new unsigned char*[968];
    for(int j=0; j<968; j++){
        Imagedata[i][j]= new unsigned char[3];
    }
}

Теперь я открываю файл и читаю его в массив как:

ifstream ifile;
ifile.open("abcde.raw", ios::in|ios::binary);
for(int i=0; i<1278; i++){
    for(int j=0; j<968; j++){
        for(int k=0; k<3; k++){
            ifile>>Imagedata[i][j][k];
        }
    }
}
ifile.close();

Следующий шаг - просто переписать байты в новый файл ... который я называю rawfile .. Я пытался добиться этого следующим образом:

ofstream myfile;
myfile.open("rawfile.raw", ios::out|ios::binary);
for(int i=0; i<1278; i++){
    for(int j=0; j<968; j++){
        myfile.write((char *)Imagedata[i][j],3*sizeof(unsigned char));
    }
}
myfile.close();

Кажется, что-то не работает .. файл изображения, который я получаю, является мусором ... в чем может быть проблема?

Ответы [ 2 ]

3 голосов
/ 11 сентября 2011
ifile>>Imagedata[i][j][k];

Это форматированный ввод, он использует символы пробела, даже если вы указали ios::binary.Используйте

Imagedata[i][j][k] = ifile.get();

Еще лучше, выделите один большой кусок памяти для всего файла и прочитайте его одним вызовом read.Что вы делаете сейчас, так это выделяете указатель для каждого пикселя, что очень расточительно, особенно для 64-битных систем.

0 голосов
/ 11 сентября 2011

Могу поспорить, что это потому, что по умолчанию в файлах установлен флаг skipws.Сразу после открытия ваших потоков добавьте файл file.unsetf (std :: ios_base :: skipws);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...