读取图片的技巧:将图片内嵌到 exe 文件中

程序中加载图片资源是常见需求。通常使用相对路径加载图片时,发布项目要把图片一起发布,否则会导致图片无法加载。本文讲解如何将图片和程序集成在一起,这样可以做出来只需要一个 .exe 文件就能正确加载图片资源。

#pragma once
#include <easyx.h>
#include <string>
#include <fstream>
#include <iostream>
int main(int argn,char * argv[])
{
    IMAGE img;
    if (argn == 4) {
        std::string inputFilePath = argv[1];
        std::ifstream inputFile(inputFilePath, std::ios::binary);
        if (!inputFile.is_open()) {
            std::cerr << "Error: Cannot open input file: " << inputFilePath << std::endl;
            return false;
        }
        loadimage(&img, inputFilePath.c_str());
        std::string outputHeaderPath =argv[2];
        std::ofstream headerFile(outputHeaderPath);
        if (!headerFile.is_open()) {
            std::cerr << "Error: Cannot create header file: " << outputHeaderPath << std::endl;
            return false;
        }
        DWORD* pMem = GetImageBuffer(&img);
        int width = img.getwidth();
        int height = img.getheight();
        headerFile << "#pragma once" << std::endl << std::endl;
        headerFile << "#include <cstdint>" << std::endl << std::endl;
        headerFile << "const size_t " << argv[3] << "_size = " << std::dec << width * height << "; " << std::endl<<std::endl;
        headerFile << "const size_t " << argv[3] << "_width = " << std::dec << width << "; " << std::endl << std::endl;
        headerFile << "const size_t " << argv[3] << "_height = " << std::dec << height << "; " << std::endl<<std::endl;
        headerFile << "const unsigned int " << argv[3] << "[] = {" << std::endl;
        for (int i = 0; i < width * height; i++) {
            headerFile << "0x" << std::hex << static_cast<int>(pMem[i]);
            if (i < width * height - 1) {
                headerFile << ", ";
            }
            if ((i + 1) % 16 == 0) {
                headerFile << std::endl;
            }
        }
        headerFile << "};" << std::endl;
        std::cout << "转换成功." << std::endl;
    }
    else
    {
        std::cout << "命令格式: "<<argv[0]<<" 源文件名 目标文件名 转换后的数组名称" << std::endl<<std::endl;
    }
    
    return 0;
}

用上面生成的可执行程序在cmd窗口,把一个图片文件转换成头文件,并把这个头文件包含到你的程序中。
(假设生成的程序名为convert.exe,有一个图片文件back.png,生成的头文件为imgback.h,转换后的数组名称为imgback)
把convert.exe和back.png两个文件复制到一个目录下,使用下面的命令开始转换。

convert back.png imgback.h imgback

使用示例

#pragma once
#include <easyx.h>
#include "imgback.h"

IMAGE img;

int main()
{
    initgraph(500, 500);
    img.Resize(imgback_width, imgback_height);
    DWORD* pMem = GetImageBuffer(&img);
    for (int i = 0; i < imgback_size; i++)
    {
        pMem[i] = imgback[i];

    }
    putimage(0, 0, &img);
    while (1);
    closegraph();
    return 0;
}
posted @ 2026-01-12 21:17  让泪化作相思雨  阅读(14)  评论(0)    收藏  举报