Чтение / запись PPM-изображения C ++, новый образ не работает

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

    #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

Решение

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

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

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

По вопросам рекламы [email protected]