0

0

C++怎么用资源文件 C++在程序中嵌入图片资源【技巧】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-07 11:52:03

|

535人浏览过

|

来源于php中文网

原创

.rc文件是windows原生资源编译唯一入口,需用rc.exe将图片转为二进制块再链接;路径须相对于项目根目录,id须为整数或宏,类型声明bitmap不校验实际格式;跨平台应改用c数组或qrc;路径、符号、初始化三者必须严格匹配。

c++怎么用资源文件 c++在程序中嵌入图片资源【技巧】

Windows平台用.rc文件嵌入图片资源

Visual Studio项目里,.rc是唯一被原生支持的资源编译入口。你不能直接把PNG塞进EXE,得靠RC编译器(rc.exe)转成二进制块,再由链接器合并进去。

常见错误是把图片路径写成相对路径却没设工作目录——rc.exe默认在项目根目录找文件,不是在.rc同目录。结果编译报错:fatal error RC1015: cannot open include file 'res/icon.png'

  • 资源ID必须是整数或已定义的宏(如#define IDB_LOGO 101),别用字符串名
  • 图片类型写BITMAP(即使你放的是PNG,RC工具只认格式声明,不校验内容)
  • VS中右键.rc → “属性” → “排除于生成”必须设为“否”,否则资源根本不会编译
LOGO_IMAGE BITMAP "res\logo.png"

运行时加载BITMAP资源要绕过GDI+限制

LoadImageLoadBitmap只能加载BITMAP资源,但返回的是HBITMAP,没法直接喂给现代UI库(比如Qt的QPixmap或Direct2D的ID2D1Bitmap)。你得手动提取像素数据。

容易踩的坑:用GetDIBits前忘了创建兼容DC,或者没调GetObject查真实位深度,导致内存拷贝错位、图片发绿或全黑。

立即学习C++免费学习笔记(深入)”;

光子AI
光子AI

AI电商服饰商拍平台

下载
  • LoadImage(NULL, MAKEINTRESOURCE(IDB_LOGO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION),加LR_CREATEDIBSECTION才能拿到可读像素指针
  • GetObject(hbmp, sizeof(BITMAP), &bm)确认bm.bmBitsPixel是24还是32——很多PNG导出带Alpha,但BITMAP资源默认不存Alpha通道
  • 如果原图是PNG且需要透明度,别走RC路线,改用Base64编码嵌入或单独打包资源DLL

跨平台方案别碰.rc,改用编译期二进制注入

Linux/macOS没有rc.exe,CMake或Meson项目里硬塞.rc等于自废武功。更通用的做法是把图片转成C数组,用objcopyxxd生成.o文件。

典型错误是用xxd -i logo.png生成的数组名含点号(如logo_png),但C++变量名不允许点,GCC会静默失败,链接时报undefined reference to 'logo_png'

  • xxd -i -n logo_data logo.png > logo.h指定符号名,避免非法字符
  • 在C++里extern "C" const unsigned char logo_data[];声明,别漏extern "C"——C++ name mangling会让链接器找不到符号
  • 数组大小得另声明:extern "C" const unsigned int logo_data_len;xxd会自动生成

Qt项目里用qrc比.rc更省事但要注意构建时机

如果你用Qt,.qrc是更自然的选择,:/images/logo.png路径能直接传给QPixmap。但它不是编译进EXE,而是打包进Qt的资源系统,依赖Q_INIT_RESOURCE初始化。

最常被忽略的一点:CMake项目里没调qt_add_resources,或.qrc文件没加到add_executable源列表,结果运行时QPixmap(":/images/logo.png")构造失败,isNull()返回true,但没有任何错误提示。

  • 确保.qrc文件在CMakeLists.txt中被qt_add_resources处理,不是简单当成普通源文件
  • 在main()开头加Q_INIT_RESOURCE(your_resource_name);,名字取自<rcc></rcc>标签里的name属性,不是文件名
  • 调试时用QDir::setCurrent("qrc:/")QDir().entryList()看资源是否真加载了
资源嵌入这事,核心就一条:**路径、符号、初始化三者必须对得上,缺一不可**。RC文件看着老派,但在纯Win32项目里最稳;跨平台或现代框架优先选编译期注入或专用资源系统。别信“一次编写到处运行”的资源路径,每个环境都得单独验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

3858

2023.10.31

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

76

2025.08.15

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

107

2025.12.05

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

363

2023.10.11

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

451

2023.10.18

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.8万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号