首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图片从联机保存到本地存储区QT5.1

将图片从联机保存到本地存储区QT5.1
EN

Stack Overflow用户
提问于 2014-01-13 04:38:03
回答 1查看 483关注 0票数 0

我正在编写一个程序,它将有一个用户列表,每个用户将有他们自己的照片,从一个在线来源。我正在成功下载数据,我正在努力格式化图片格式。它成功地保存了文件,但没有以可读的格式保存。

代码语言:javascript
复制
void FriendsListProcess::picRequesFinished(QNetworkReply *reply)
{
    QByteArray data = reply->readAll();
    if(reply->error())
    {
        qDebug() << reply->errorString();
        return;
    }
    emit savePic(pic_name_path,data);
    reply->deleteLater();
}

void FriendsListProcess::savePicToFile(QString file, QByteArray &pic_data)
{
qDebug() << "File name from write pic: " << file;
QFile f(file);
if(f.open(QIODevice::WriteOnly))
{
    QDataStream out(&f);
    out << pic_data;
        f.close();
}
}

当我试图打开保存的文件时,窗口显示

代码语言:javascript
复制
"Windows Photo Viewer can't open this picture because either Photo Viewer doesn't support this file format. or you don't have the lates updates to Photo Viewer"

你们有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 04:56:18

您的代码中存在以下问题:

  • 您将图像数据写入,就好像它是文本流,而它是二进制流。
  • 你把所有的东西都看得一干二净。这可能会浪费更多的内存。
  • 代码中缺少错误检查。
  • 你在这里不必要地有信号/插槽。
  • 检查已完成的处理程序槽中的QNetworkReply错误是多余的,因为这样的事情最好在错误信号处理程序槽中捕获。
  • 您以ReadOnly的形式打开文件,而您想要编写它。
  • 使用文本打开模式标志打开文件,而图像是二进制数据。

我会写这样的东西:

代码语言:javascript
复制
void FriendsListProcess::picRequesFinished(QNetworkReply *reply)
{
    QFile file(pic_name_path);
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "Failed to open the file for reading:" << file.fileName();
        return;
    }

    // You would need to make sure you do not get irrelevant data in the meantime
    while (reply->bytesAvailable()) {
        if (file.write(reply->read(512)) == -1)
            qDebug() << "Error while reading data:" << file.errorString();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21083985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档