>魔幻数字; 在>>宽度>>高度>>最大值; in.get(); 字符**图像; 图像=新字符*[宽度]; 对于(i=0;i图像[i][j]; } } 打开(“NewImage.ppm”,std::ios::binary); out,c++,image,ppm,C++,Image,Ppm" /> >魔幻数字; 在>>宽度>>高度>>最大值; in.get(); 字符**图像; 图像=新字符*[宽度]; 对于(i=0;i图像[i][j]; } } 打开(“NewImage.ppm”,std::ios::binary); out,c++,image,ppm,C++,Image,Ppm" />

读取/写入PPM图像C++;,新图像被破坏 我发现这里有一些C++代码用于读/写图像。我想改进它,以便我可以旋转等图像。然而,一开始我有一些问题。当我写入图像时,我的read函数似乎只读取其中的一部分,因为它只将原始图像的一部分写入文件。请查看我的代码和输入、输出图像 #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; } #包括 #包括 #包括 使用名称空间std; int main(int argc,字符**argv) { 如果输入; in.open(“OldImage.ppm”,std::ios::binary); 流出的液体; std::字符串幻数; 整数宽度,高度,最大值,i,j; 在>>魔幻数字; 在>>宽度>>高度>>最大值; in.get(); 字符**图像; 图像=新字符*[宽度]; 对于(i=0;i图像[i][j]; } } 打开(“NewImage.ppm”,std::ios::binary); out

读取/写入PPM图像C++;,新图像被破坏 我发现这里有一些C++代码用于读/写图像。我想改进它,以便我可以旋转等图像。然而,一开始我有一些问题。当我写入图像时,我的read函数似乎只读取其中的一部分,因为它只将原始图像的一部分写入文件。请查看我的代码和输入、输出图像 #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; } #包括 #包括 #包括 使用名称空间std; int main(int argc,字符**argv) { 如果输入; in.open(“OldImage.ppm”,std::ios::binary); 流出的液体; std::字符串幻数; 整数宽度,高度,最大值,i,j; 在>>魔幻数字; 在>>宽度>>高度>>最大值; in.get(); 字符**图像; 图像=新字符*[宽度]; 对于(i=0;i图像[i][j]; } } 打开(“NewImage.ppm”,std::ios::binary); out,c++,image,ppm,C++,Image,Ppm,根据ppm图像文件有两种形式:原始和普通。您似乎采用了正常的原始格式,但您使用的是幻数P3,这是普通ppm。请尝试P6 此外,您的高度和宽度循环应该反过来,但这不会影响结果。旋转图像可能是您代码的一部分。ppm文件的每个像素有3个值(R、G和B)。您的代码假设只有1个值(强度?)。请尝试读取和写入pgm文件(使用“幻数”等于P2) 或者,读取每个像素的所有3个值: typedef char (*row_ptr)[3]; // I don't know how to express the fol

根据ppm图像文件有两种形式:原始和普通。您似乎采用了正常的原始格式,但您使用的是幻数P3,这是普通ppm。请尝试P6


此外,您的高度和宽度循环应该反过来,但这不会影响结果。旋转图像可能是您代码的一部分。

ppm
文件的每个像素有3个值(R、G和B)。您的代码假设只有1个值(强度?)。请尝试读取和写入
pgm
文件(使用“幻数”等于
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];
        }
    }
}
typedef char(*row_ptr)[3];
//如果没有typedef,我不知道如何表达以下内容
字符(**图像)[3]=新行_ptr[高度];
...

对于(i=0;i根据ur代码更改代码:但具有相同的效果:(