读取/写入PPM图像文件C++



尝试以我所知道的唯一方式读写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;
}

逻辑错误:

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

类公共成员变量:

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/Arial.512.ppm),并使用以下结构PPMObject进行操作。

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

相关内容

  • 没有找到相关文章

最新更新