2017-04-04 5 views
0

Je suis en train de créer une application Qt utilisant un appareil photo. Dans cette application, les images capturent des images, puis elles sont automatiquement enregistrées dans un dossier spécifique. Tout fonctionne bien.Sauvegarder des images et les afficher ensuite dans un QLabel

Maintenant, quand le bouton "bibliothèque" est cliqué, je veux lire toutes les images (fichiers JPEG) et afficher toutes les images qui ont été prises une par une QLabel.

Je n'ai pas trouvé de tutoriels pour ce didacticiels seulement trouvés et utilise l'argument argv ce qui n'est pas bon pour moi, car dans mon application, l'utilisateur peut capturer des images et les afficher dans le même cycle.

Comment lire la liste des fichiers et l'afficher?

Merci beaucoup :)

+0

Qu'est-ce que vous avez des problèmes avec? Afficher l'image dans le QLabel? Lire la liste des fichiers? –

+0

lire la liste des fichiers –

+4

Veuillez jeter un coup d'œil à [cette section d'aide] (http://stackoverflow.com/help/how-to-ask). À l'heure actuelle, votre question ne montre pas beaucoup d'efforts de recherche et aucun problème clair avec lequel quelqu'un peut vous aider. Au lieu de cela, il demande soit un lien ou un code complet à partir de zéro qui est hors sujet sur SO. – Bowdzone

Répondre

0

Si vous avez un seul QLabel alors vous devez joindre les images ensemble un seul. Je trouve plus facile d'afficher une liste des 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); 

La dernière ligne dépendra du moment où voulez-vous de placer les étiquettes. Je suggère un widget avec une barre de défilement.

Maintenant, vous voulez lire toutes les images d'un répertoire (la variable listOfImages ci-dessus). Si vous ne l'avez pas:

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

Vous pouvez avoir des problèmes de mise en page si vos images sont trop grandes. Dans ce cas, vous devez les mettre à l'échelle s'ils sont plus gros qu'une taille donnée. Jetez un oeil à QPixmap::scaled ou QPixmap::scaledToWidth. En outre, si la qualité de l'image est importante, spécifiez Qt::SmoothTransformation comme mode de transformation.

0

Vous pouvez utiliser la bibliothèque opencv pour lire toutes les images d'un répertoire.

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

Afin de convertir le type de tapis à QImage, nous utilisons la fonction 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(); 
    } 
}