Linux Qt 如何使用QDataStream 保存一张张图片到一个二进制文件,图片数据较多,二进制文件大于4个G 需要一个代码示例
时间: 2024-09-19 19:13:20 浏览: 51
在Linux环境下,Qt库中的`QDataStream`可以用于序列化和反序列化数据,包括像图片这样的二进制数据。如果你需要处理大文件,如超过4GB的二进制文件,直接一次性读写可能会遇到内存限制。在这种情况下,你可以分块操作,将图片分割成小部分,然后逐块写入文件。
下面是一个简单的代码示例,假设我们已经有了一个`UIImage`对象`img`:
```cpp
#include <QFile>
#include <QDataStream>
#include <QImageWriter>
// 图片大小,可以根据实际情况调整
const int blockSize = 1024 * 1024 * 16; // 比如16MB
void saveImageToBinaryFile(const QImage &image, const QString &fileName) {
QFile file(fileName, QIODevice::WriteOnly | QIODevice::Truncate);
if (!file.open()) {
qDebug() << "Failed to open file: " << fileName;
return;
}
qint64 totalSize = image.saveData(file, "PNG"); // 或者JPEG、BMP等其他格式
if (totalSize == -1) {
qDebug() << "Failed to write image data";
file.close();
return;
}
qint64 remainingBytes = totalSize;
while (remainingBytes > 0) {
qint64 bytesToWrite = qMin(blockSize, remainingBytes);
qint64 actualWritten = file.write(image.saveData(nullptr, bytesToWrite));
if (actualWritten != bytesToWrite) {
qDebug() << "Error writing to file";
file.close();
break;
}
remainingBytes -= bytesToWrite;
}
if (remainingBytes == 0) {
qDebug() << "Successfully wrote entire image to file";
} else {
qDebug() << "Wrote only part of the image due to block size limit";
}
file.close();
}
// 调用方法
QImage img;
// ... load or create your QImage
saveImageToBinaryFile(img, "large_image.bin");
```
在这个例子中,我们先尝试打开文件并计算总大小。然后,每次从图像数据开始写入指定大小的数据块,直到所有的数据都被写入。如果在写入过程中遇到错误,我们会停止并关闭文件。
阅读全文