保存图像,然后在QLabel中显示它们

时间:2017-04-04 08:15:35

标签: c++ qt qimage

我目前正在构建一个使用相机的Qt应用程序。 在此应用程序中,使用捕获图像,然后它们会自动保存在特定文件夹中。一切都很好。

现在,当"库"单击按钮,我想读取所有图像(JPEG文件)并显示在QLabel中逐个拍摄的所有图像。

我找不到任何教程,只找到教程并使用argv参数,这对我没有好处,因为在我的应用程序中,用户可以捕获图像,然后在同一个中显示它们运行

如何读取文件列表并显示它?

非常感谢:)

2 个答案:

答案 0 :(得分:0)

如果您只有一个QLabel,那么您必须将图像合并为一个。我发现更容易显示QLabel s列表:

auto layout = new QVBoxLayout();
Q_FOREACH (auto imageName, listOfImages) {
  QPixmap pixmap(dirPath + "/" + imageName);
  if (!pixmap.isNull()) {
    auto label = new QLabel();
    label->setPixmap(pixmap);
    layout->addWidget(label);
  }
}
a_wdiget_where_to_show_images->setLayout(layout);

最后一行取决于您何时要放置标签。我推荐一些带滚动条的小部件。

现在,您想要读取目录中的所有图像(上面的listOfImages变量)。如果你没有它:

const auto listOfImages = QDir(dirPath).entryList(QStringList("*.jpg"), QDir::Files);

如果图片太大,可能会出现布局问题。在这种情况下,如果它们大于给定大小,则应缩放它们。请查看QPixmap::scaledQPixmap::scaledToWidth。此外,如果图像质量很重要,请将Qt::SmoothTransformation指定为转换模式。

答案 1 :(得分:0)

您可以使用opencv库来读取目录中的所有图像。

    vector<String> filenames; // notice here that we are using the Opencv's embedded "String" class
    String folder = "Deri-45x45/";  // again we are using the Opencv's embedded "String" class

    float sayi = 0;
    glob(folder, filenames); // new function that does the job ;-)
    float toplam = 0;
    for (size_t i = 0; i < filenames.size(); ++i)
    {
        Mat img = imread(filenames[i],0);

        //Display img in QLabel
        QImage imgIn = putImage(img);
        imgIn = imgIn.scaled(ui->label_15->width(), ui->label_15->height(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
        ui->label_15->setPixmap(QPixmap::fromImage(imgIn));
    }

为了将Mat类型转换为QImage,我们使用putImage函数:

QImage putImage(const Mat& mat)
{
    // 8-bits unsigned, NO. OF CHANNELS=1
    if (mat.type() == CV_8UC1)
    {

        // Set the color table (used to translate colour indexes to qRgb values)
        QVector<QRgb> colorTable;
        for (int i = 0; i < 256; i++)
            colorTable.push_back(qRgb(i, i, i));
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        img.setColorTable(colorTable);
        return img;
    }
    // 8-bits unsigned, NO. OF CHANNELS=3
    if (mat.type() == CV_8UC3)
    {
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return img.rgbSwapped();
    }
    else
    {
        qDebug() << "ERROR: Mat could not be converted to QImage.";
        return QImage();
    }
}