【问题标题】:Save Image into a file in C++将图像保存到 C++ 中的文件中
【发布时间】:2021-02-01 12:56:17
【问题描述】:

我想将图像保存到自定义文件中,以保护我程序的所有图像。

我试图保存这样的图像的每个像素(作为 Uint32)(我正在使用 SFML)

void fromPNGtoCustomFile(sf::Texture texture, std::string path)
{
    std::ofstream fo; 
    fo.open(path);

    sf::Image image=texture.copyToImage(); //GET IMAGE OF THE TEXTURE

    fo << image.getSize().x << " " << image.getSize().y << " "; // WRITE THE SIZE OF THE IMAGE

    for(unsigned int i=0; i< image.getSize().x; i++)
    {
        for(unsigned int j=0; j< image.getSize().y; j++)
        {
            fo << image.getPixel(i, j).toInteger() << " "; 

            // image.getPixel(x, y).toInteger() RETURNS A Uint32 VALUE
        }
    }


    fo.close();
}

然后我使用相同的逻辑从文件中加载图像。

它有效,但我意识到我创建的文件大小约为 250 Mb,而我的原始 .png 图像只有 8 Mb。如果我使用 7Zip 压缩新文件,我会得到一个 8 Mb 的文件,作为原始大小。我不明白为什么我会得到这个尺寸。

我真的不知道创建用于保存图像的自定义文件的最佳方法是什么。

您对我的代码有什么建议或更正吗?

【问题讨论】:

  • 您不了解的压缩到底是什么? Png 文件已压缩。
  • 我不确定这里的问题是什么。您的代码效率非常低,但并非不正确。那你到底想要什么?
  • 好吧,我有一个名为“ressources”的文件夹,用于存储我程序的所有图像。我不希望任何人窃取它们,所以我想创建一个自定义文件和某种“加密”图像数据。我不知道我的问题是否清楚
  • @Peanut_Butcher 上面的代码在什么方面没有实现呢?我仍然对您对我们的期望感到困惑(这是我上一条评论的真正含义)。
  • 如果您关心的是加密,那么为什么不使用加密库(例如 libcrypt),将图像保存为 jpeg 格式但已加密。

标签: c++ image file save sfml


【解决方案1】:

要回答为什么文件大小如此之大的问题,这是因为您正在独立编写每个像素的信息,因此您的文件最终会尽可能大。为了减小尺寸,压缩格式利用了例如通常存在大量相同颜色的相邻像素的事实。例如,天空图像很可能包含大量相同蓝色阴影的像素。所以你需要做的是用某种特殊代码定义一个算法来表示“接下来的 N 个像素是 某种 RGB 颜色”或类似的东西。

关于图像数据压缩的一个很好的来源是 DSP 指南的这一章:http://www.dspguide.com/ch27.htm

【讨论】:

  • 谢谢,我试试这个!
猜你喜欢
  • 2023-04-02
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多