Сохранение изображений и их последующее отображение в QLabel

В настоящее время я создаю приложение Qt, использующее некоторую камеру. В этом приложении используется захват изображений, после чего они автоматически сохраняются в определенной папке. Все отлично работает.

Теперь, когда нажата кнопка «библиотека», я хочу прочитать все изображения (файлы JPEG) и отобразить все изображения, которые были сделаны одно за другим в файле QLabel.

Я не смог найти никаких учебных пособий для этого, нашел только учебные пособия и использует аргумент argv, который мне не подходит, потому что в моем приложении пользователь может захватывать изображения, а затем отображать их в одном и том же прогоне.

Как можно прочитать список файлов и отобразить его?

Большое спасибо :)


person J.Cohen    schedule 04.04.2017    source источник
comment
С чем у тебя проблемы? Отображение изображения в QLabel? Чтение списка файлов?   -  person Karsten Koop    schedule 04.04.2017
comment
чтение списка файлов   -  person J.Cohen    schedule 04.04.2017
comment
Ознакомьтесь с этим разделом справки. На данный момент ваш вопрос не требует особых исследований, и нет четкой проблемы, с которой кто-то может вам помочь. Вместо этого он запрашивает либо ссылку, либо полный код с нуля, что не соответствует теме SO.   -  person Bowdzone    schedule 04.04.2017
comment
Взгляните на QDir   -  person Karsten Koop    schedule 04.04.2017


Ответы (2)


Если у вас есть один QLabel, вам нужно объединить изображения в одно. Мне проще отобразить список QLabel:

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::scaled или QPixmap::scaledToWidth. Кроме того, если качество изображения важно, укажите Qt::SmoothTransformation в качестве режима преобразования.

person cbuchart    schedule 04.04.2017

Вы можете использовать библиотеку 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();
    }
}
person michael scolfield    schedule 07.04.2017