读取/写入 PPM 图像C++,新图像损坏
Reading/Writing PPM image C++, new image is broken
我在SO上找到了一些用于读取/写入图像的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
根据此文档,ppm图像文件有两种形式:原始和普通。您似乎假设正常的原始格式,但您使用的是用于普通 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
.
相关文章:
- 为什么会发生堆损坏
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 图像在本地主机上显示已损坏
- 滚动时,wxscrolledwindow中的图像损坏
- 从垫子到矢量,<Vec3f>反之亦然,而不会损坏图像
- SFML图像加载在发布版本上失败 - 文件名损坏
- C++中的图像HTTP上载已损坏
- Bitblt,createdibssection,图像损坏
- vo_ros/VO: malloc():由图像大小引起的内存损坏
- 从android部分发送图像并从pc接收,但图像已损坏
- 读取/写入 PPM 图像C++,新图像损坏