cpp将图片等文件编译进程序、运行时载入和释放

⌚Time: 2023-12-19 20:14:56

👨‍💻Author: Jack Ge

将文件生成c语言文件

用图片资源作为例子,使用16进制编辑器如"HxD"打开

直接导出为c语言文件

查看导出的c语言文件,定义了一个rawData变量,里面储存的是图片的16进制数据

实际上也可以不用HxD,可以自己写一个程序,用二进制模式打开文件,然后根据数据生成一个类似的c语言文件储存文件信息,也是一样的效果。

使用生成的c语言文件

可以编写一个简单的头文件声明数据变量

resfile.h


extern unsigned char rawData[143134];

在其他文件中使用只需要包含该头文件就可以了

test.c


#include "resfile.h"

...

编译时将导出的c语言文件与其他文件一起编译就可以了。


g++ export.c test.cpp -o test.exe

直接在内存中使用文件

可以直接在内存中使用,例如opencv库,可以使用cv::imdecode函数从内存中读取图片然后显示


    //将文件数据拷贝到容器

    std::vector<unsigned char> binaryData;

    for(int i=0;i<sizeof(rawData)/sizeof(unsigned char);i++){

        binaryData.push_back(rawData[i]);

    }

    //从数据中解码图片

    cv::Mat decodedImage = cv::imdecode(binaryData,cv::IMREAD_UNCHANGED);

    cv::namedWindow("Image", cv::WINDOW_NORMAL);

    //显示图片

    cv::imshow("Image", decodedImage);

        cv::waitKey(0);

    cv::destroyWindow("Image");

释放文件

释放到文件非常简单,直接使用二进制方式将内存中的数据写入文件


    std::ofstream oFile("out.jpg",std::ios::binary);

    if(oFile.is_open()){

        oFile.write((const char*)rawData,sizeof(rawData));

        oFile.close();

    }

    

我编写了一个测试的程序,实现了使用opencv显示编译进程序中的图片,并且将图片释放到文件


#include <iostream>

#include <vector>

#include <fstream>

#include <opencv2/opencv.hpp>

#include "resfile.h"



int main(){

    //将文件数据拷贝到容器

    std::vector<unsigned char> binaryData;

    for(int i=0;i<sizeof(rawData)/sizeof(unsigned char);i++){

        binaryData.push_back(rawData[i]);

    }

    //从数据中解码图片

    cv::Mat decodedImage = cv::imdecode(binaryData,cv::IMREAD_UNCHANGED);

    cv::namedWindow("Image", cv::WINDOW_NORMAL);

    //显示图片

    cv::imshow("Image", decodedImage);

        cv::waitKey(0);

    cv::destroyWindow("Image");

    

    //将文件数据导出到文件

    std::ofstream oFile("out.jpg",std::ios::binary);

    if(oFile.is_open()){

        oFile.write((const char*)rawData,sizeof(rawData));

        oFile.close();

    }

    

    return 0;

}




程序的运行过程,显示了程序中的图片,并释放图片到文件

当然除了图片文件,其他文件资源也是一样的办法