gpt4 book ai didi

c++ - 读/写 PPM 图像文件 C++

转载 作者:行者123 更新时间:2023-11-30 20:28:38 24 4
gpt4 key购买 nike

尝试以我知道的唯一方式读取和写入 PPM 图像文件 (.ppm):

std::istream& operator >>(std::istream &inputStream, PPMObject &other)
{
inputStream.seekg(0, ios::end);
int size = inputStream.tellg();
inputStream.seekg(0, ios::beg);

other.m_Ptr = new char[size];


while (inputStream >> other.m_Ptr >> other.width >> other.height >> other.maxColVal)
{
other.magicNum = (string) other.m_Ptr;
}

return inputStream;
}

我的值对应于实际文件。于是我兴高采烈地尝试写入数据:

std::ostream& operator <<(std::ostream &outputStream, const PPMObject &other)
{
outputStream << "P6" << " "
<< other.width << " "
<< other.height << " "
<< other.maxColVal << " "
;

outputStream << other.m_Ptr;

return outputStream;
}

我确保使用 std::ios::binary 打开文件进行读取和写入:

int main ()
{
PPMObject ppmObject = PPMObject();
std::ifstream image;
std::ofstream outFile;

image.open("C:\\Desktop\\PPMImage.ppm", std::ios::binary);
image >> ppmObject;

image.clear();
image.close();

outFile.open("C:\\Desktop\\NewImage.ppm", std::ios::binary);
outFile << ppmObject;

outFile.clear();
outFile.close();

return 0;
}

逻辑错误:

我只写了图像的一部分。文件头或手动打开文件没有问题。

类公共(public)成员变量:

m_Ptr成员变量是一个char *,高度、宽度maxColrVal都是整数。

尝试的解决方案:

使用inputStream.read和outputStream.write来读取和写入数据,但我不知道如何以及我尝试过的方法不起作用。

因为我的 char * m_Ptr 包含所有像素数据。我可以迭代它:

for (int I = 0; I < other.width * other.height; I++) outputStream << other.m_Ptr[I];

但是由于某种原因这会导致运行时错误..

最佳答案

基于http://fr.wikipedia.org/wiki/Portable_pixmap ,P6是二值图像。这会读取单个图像。请注意,不执行任何检查。需要添加此内容。

std::istream& operator >>(std::istream &inputStream, PPMObject &other)
{
inputStream >> other.magicNum;
inputStream >> other.width >> other.height >> other.maxColVal;
inputStream.get(); // skip the trailing white space
size_t size = other.width * other.height * 3;
other.m_Ptr = new char[size];
inputStream.read(other.m_Ptr, size);
return inputStream;
}

此代码写入单个图像。

std::ostream& operator <<(std::ostream &outputStream, const PPMObject &other)
{
outputStream << "P6" << "\n"
<< other.width << " "
<< other.height << "\n"
<< other.maxColVal << "\n"
;
size_t size = other.width * other.height * 3;
outputStream.write(other.m_Ptr, size);
return outputStream;
}

m_Ptr 仅包含 RGB 像素值。

我在从网上下载的图像( http://igm.univ-mlv.fr/~incerti/IMAGES/COLOR/Aerial.512.ppm )上测试了代码,并使用以下结构 PPMObject 它起作用了。

struct PPMObject
{
std::string magicNum;
int width, height, maxColVal;
char * m_Ptr;
};

关于c++ - 读/写 PPM 图像文件 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60070219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com