如何将 JPEG 图像加载到字符数组 C++ 中?

How to load an JPEG image into a char array C++?

我想将 JPEG 图像存储到普通的无符号字符数组中,我使用 ifstream 来存储它;但是,当我检查我存储的数组是否正确时(通过再次将其重写为JPEG图像),我使用存储的数组重写的图像无法正确显示,所以我认为问题一定来了从我用来将图像存储到数组中的技术来看是不正确的。我想要一个可以完美存储的数组,以便我可以用它重写回 JPEG 图像 again.I 如果有人能帮我解决这个问题,我将不胜感激!

int size = 921600;
    unsigned char output[size];
    int i = 0;

    ifstream DataFile;
    DataFile.open("abc.jpeg");
    while(!DataFile.eof()){
        DataFile >> output[i];
        i++;
    }
    /* i try to rewrite the above array into a new image here */
    FILE * image2;
    image2 = fopen("def.jpeg", "w");
    fwrite(output,1,921600, image2);
    fclose(image2);

显示的代码中存在多个问题。

while(!DataFile.eof()){

这是always a bug。有关详细说明,请参阅链接的问题。

    DataFile >> output[i];

格式化提取运算符 >> 根据定义跳过所有白色 space 字符并忽略它们。您的 jpg 文件肯定有字节 0x09、0x20 和其他一些字节,在其中的某处,这会自动跳过并且不会读取它们。

为了正确执行此操作,您需要use read() and gcount() 读取您的二进制文件。正确使用 gcount() 还应该使您的代码正确检测到文件结束条件。

确保在打开文件时添加错误检查。找到文件大小,根据文件大小读入缓冲区。

您也可以考虑使用 std::vector<unsigned char> 进行字符存储。

int main()
{
    std::ifstream DataFile("abc.jpeg", std::ios::binary);
    if(!DataFile.good())
        return 0;

    DataFile.seekg(0, std::ios::end);
    size_t filesize = (int)DataFile.tellg();
    DataFile.seekg(0);

    unsigned char output[filesize];
    //or std::vector
    //or unsigned char *output = new unsigned char[filesize];
    if(DataFile.read((char*)output, filesize))
    {
        std::ofstream fout("def.jpeg", std::ios::binary);
        if(!fout.good())
            return 0;
        fout.write((char*)output, filesize);
    }

    return 0;
}