怎样在Qt中读取PNG文件,并写入.dat文件中

你需要的是这个http://doc.qt.io/qt-5/rcc.htmlQt的资源系统用过没?就是qrc文件,工程-右键-新建文件里,可以建立资源文件但这样包含在工程里的资源文件,实际编译时是直接把资源内容也编译到发布程序里,你发布时不需要另外附上资源但Qt提供了rcc工具,可以把资源文件单独打包成一个二进制文件。然后运行时通过资源系统加载后,就和直接参与编译的.qrc资源一样使用,比如QImage image(":/image/sun.png")于是,你这个问题就很好解决了。用QFileInfo遍历目标文件夹,取出所有图片文件的绝对路径。然后用QFile生成一个qrc文件,里面包含这些图片。最后用QProcess启动rcc工具,将其打包为.rcc文件再然后么……你非要叫.dat也行,把.rcc改下扩展名就是了而且这样还有个好处,就是不仅限于.png文件,理论上所有文件都可以放进qrc里然后打包成二进制数据文件发布的——————————————————————————————————更新,刚从评论获知题主的需求是这样的:写进dat文件的先是一个头,包含打包的时间和图片个数,再是一个索引,指向每个图片,也包含每张图片的长宽等信息。最后是每张图片那答主已经做完大部分工作了。文件索引和文件信息部分已经处理完成,差的是填入二进制数据这个么……用QFile打开文件,readAll()后写入目标文件就行了,其实挺简单这个需求,就只有偏移量麻烦一点我这边正好也有数据处理的程序,是用类似的方式存储,我把我用的实现方式大致写一下吧#pragma pack(push, 1) // 强令编译器将数据按1字节对其,省得算内存对齐头疼struct Node;struct NodeInfo {qint64 time;quint32 nodeNum;// qint64* nodeOffsets;};/* 这里nodeOffsets也可以用qint64 nodeOffsets定义 * 但0长度数组是未定义行为,不保证所有编译器都能按照预期的情况处理 *//* 如果这个struct不是用于写文件,而是内存操作的话,其实nodeOffsets应该换成Node* nodes * 这种情况下就是一次性malloc(sizeof(NodeInfo) + n * sizeof(Node))来构造struct了 */struct Node {char name;qint64 fileSize;quint32 width;quint32 height;// quint8* fileData;};// fileData部分的处理同NodeInfo,不推荐用quint8 fileData;#pragma popvoid saveFile(QFileInfoList images, QFileInfo destFile){ QFile file(destFile.absoluteFilePath()); file.open(QFile::WriteOnly); // 计算每个node的大小 QVector\u0026lt;qint64\u0026gt; nodeSizes(images.count()); Q_FOREACH(const QFileInfo\u0026amp; imageInfo, images) nodeSizes.append(sizeof(Node) + imageInfo.size()); // 构造文件头NodeInfo NodeInfo nodeInfo; qint64 nodeInfoSize = sizeof(NodeInfo) + nodeSizes.count() * sizeof(qint64); nodeInfo.time = QDateTime::currentDateTime().toMSecsSinceEpoch(); nodeInfo.nodeNum = nodeSizes.count(); // 写入nodeInfo基础信息 file.write(reinterpret_cast\u0026lt;const char*\u0026gt;(\u0026amp;nodeInfo), sizeof(NodeInfo)); // 写入nodes偏移量 Q_FOREACH(qint64 nodeSize, nodeSizes) file.write(reinterpret_cast\u0026lt;const char*\u0026gt;(nodeSize), sizeof(qint64)); // 逐一填入Node for(int i=0;i\u0026lt;images.count();++i) { QFileInfo imageInfo = images.at(i); // 读取imgae数据 QFile imageFile(imageInfo.absoluteFilePath()); imageFile.open(QFile::ReadOnly); QByteArray imageData = https://www.zhihu.com/api/v4/questions/49890567/imageFile.readAll(); imageFile.close(); QImage image = QImage::fromData(imageData); // 构造并写入Node Node node; // 这里可以进行长度校验,以免超过64字节 // 或者struct改成quint32 fileNameSize;char* fileName; // 但那样struct的长度就成动态的了,处理起来更麻烦 strncpy(node.name, imageInfo.fileName().toUtf8().constData(), imageInfo.fileName().toUtf8().length()); node.fileSize = imageInfo.size(); node.width = image.width(); node.height = image.height(); file.write(reinterpret_cast/u0026lt;const char*/u0026gt;(/u0026amp;node, sizeof(Node)); // 写入image数据 file.write(imageData); } file.flush(); while(!file.waitForBytesWritten(100)); file.close();}


推荐阅读