2015-06-14 2 views
0

Я нашел здесь код С ++ для чтения/записи изображений. Я хотел бы улучшить его, чтобы я мог поворачивать и т. Д. Изображения. Однако вначале у меня есть некоторые проблемы. Когда я пишу изображение, кажется, что моя функция чтения читает только часть его, так как он записывает в файл только часть исходного изображения. См. Мой код и ввод, вывод изображений.Чтение/Запись PPM изображение C++, новое изображение нарушено

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main(int argc, char **argv) 
{ 
    ifstream in; 
    in.open("OldImage.ppm", std::ios::binary); 

    ofstream out; 

    std::string magic_number; 
    int width, height, maxColVal, i, j; 

    in >> magic_number; 
    in >> width >> height >> maxColVal; 
    in.get(); 

    char **image; 
    image = new char* [width]; 

    for(i=0; i<width; i++) 
    { 
     image[i] = new char [height]; 

     for(j=0; j<height; j++) 
     { 
      in >> image[i][j]; 
     } 
    } 

    out.open("NewImage.ppm", std::ios::binary); 
    out << "P3"  << "\n" 
     << width  << " " 
     << height  << "\n" 
     << maxColVal << "\n" 
     ; 

    for(i=0; i<width; i++) 
    { 
     for(j=0; j<height; j++) 
     { 
      out << image[i][j]; 
     } 
    } 

    in.clear(); 
    in.close(); 

    out.clear(); 
    out.close(); 

    return 0; 
} 

Входное изображение:https://www.dropbox.com/s/c0103eyhxzimk0j/OldImage.ppm?dl=0

Выход изображения:https://www.dropbox.com/s/429i114c05gb8au/NewImage.ppm?dl=0

ответ

0

В соответствии с this doc существуют 2 формы файла изображения частей на миллион: сырой и просто. Вы, кажется, принимаете нормальный необработанный формат, но используете магический номер P3, который для простых ppm. Попробуйте P6.

Кроме того, ваши петли высоты и ширины должны быть наоборот, но это не влияет на результат. Предположительно, это часть вашего кода для поворота изображения.

+0

это не решило мою проблему – yak

0

ppm файлы имеют 3 значения (R, G и B) для каждого пикселя. Ваш код предполагает наличие только 1 значения (интенсивность?). Попробуйте прочитать и написать pgm файлов (с «magic_number», равным P2).

В качестве альтернативы, прочитать все 3 значения для каждого пикселя:

typedef char (*row_ptr)[3]; 
// I don't know how to express the following without a typedef 
char (**image)[3] = new row_ptr[height]; 
... 
for(i=0; i<height; i++) 
{ 
    image[i] = new char[width][3]; 

    for(j=0; j<width; j++) 
    { 
     for(colour=0; colour<3; colour++) 
     { 
      in >> image[i][j][colour]; 
     } 
    } 
} 

Обратите внимание, что я переключился местами width и height, так что код соответствует порядку пикселей в файле. Было бы также полезно использовать значащие имена, такие как x и y для координат, вместо путаных имен, таких как i или j.

+0

Изменен мой код в соответствии с ур кодом: http://pastie.org/private/adweu6nup9gy0zglbwnujq, но имеют тот же эффект :( – yak

Смежные вопросы