Я нашел некоторый код 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
В соответствии с этот документ Есть 2 формы файла изображения ppm: необработанный и обычный. Вы, кажется, принимаете нормальный необработанный формат, но вы используете магическое число P3 что для простого промилле. Пытаться P6.
Кроме того, ваши петли роста и ширины должны быть наоборот, но это не влияет на результат. Предположительно, это часть вашего кода, чтобы повернуть изображение.
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
,