0

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

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();
}
}

当我尝试打开保存的文件窗口时说

"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"

你们有什么建议吗?

4

1 回答 1

1

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

  • 您将图像数据编写为文本流,而它是二进制流。

  • 您无需分块阅读即可阅读所有内容。这可能会浪费不必要的内存。

  • 您的代码中缺少错误检查。

  • 你在这里不必要地有信号/槽间接。

  • 在完成的处理程序槽中检查 QNetworkReply 错误是多余的,因为这样的事情最好在错误信号处理程序槽中捕获。

  • 您将文件打开为ReadOnly,而您想编写它。

  • 您使用文本打开模式标志打开文件,而图像是二进制数据。

我会写这样的东西:

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();
    }
}
于 2014-01-13T04:56:18.467 回答