Noms des élèves :
SPE - ISN Manipuler les tableaux Durée du TP : 2h00
Organisation : Les manipulations se feront à l’aide
L’objectif du TP est de déterminer la taille d’une image en L’algorithme principal est le suivant :
Algorithme DEBUT
Choisir_le_fichier_BMP (nomFichierBmp Lire_entete_Bmp
afficherTaille FIN
1/ Créer l’application enteteBMP commandes Ouvrir et Quitter 2/ Associer le raccourcis clavier qui permettent de faire cela :
• On peut le faire graphiquement avec QTDesigner ou par programmation La méthode par programmation consisterai
dans le constructeur de MainWindow commande doivent être également
actionQuitter->setShortCut
• Avec QTDesigner
3/ Créer les slots associés à actionQuitter Dans mainwindow.h :
public slots:
void on_actionQuitter_triggered();
void on_actionOuvrir_triggered();
Dans le mainwindow.cpp
//--- void MainWindow::on_actionQuitter_triggered()
{
//pour quitter le close();
}
//--- void MainWindow::on_actionOuvrir_triggered()
{ }
4/ En cliquant sur Ouvrir, une fenêtre de dialogue permet de choisir un fichier BMP. La validation de ce choix restitue la variable chaine nomFichierBmp.
Ecrire le code permettant de réaliser cela
void MainWindow::on_actionOuvrir_triggered() {
QString nomFichierBmp nomFichierBmp=QFileDialog image", QString(), "Images
}
Traitement d’image
Manipuler les tableaux et les fichiers BMP.
manipulations se feront à l’aide de QT Creator installé sur les ordin L’objectif du TP est de déterminer la taille d’une image en pixels et en octets.
nomFichierBmp)
BMP et la doter d’un menu Fichier comportant les
le raccourcis clavier alt+X à la commande Quitter. Recopier les lignes n peut le faire graphiquement avec QTDesigner ou par programmation.
La méthode par programmation consisterait à placer le code ci-dessous ns le constructeur de MainWindow (mais pour cela le menu et la
être également créés de manière dynamique) :
>setShortCut(QKeySequence("Alt+X"));
actionQuitter et actionOuvrir
on_actionQuitter_triggered();
on_actionOuvrir_triggered();
--- ::on_actionQuitter_triggered()
le programme alt+X est le raccourcis
--- ::on_actionOuvrir_triggered()
4/ En cliquant sur Ouvrir, une fenêtre de dialogue permet de choisir un fichier BMP. La validation de ce choix restitue la variable chaine nomFichierBmp.
le code permettant de réaliser cela
::on_actionOuvrir_triggered() nomFichierBmp = "";
QFileDialog::getOpenFileName(this, "Ouvrir
"Images (*.bmp)");
Bac. S – Spécialité ISN
QT Creator installé sur les ordinateurs et en octets.
Recopier les lignes
---
---
4/ En cliquant sur Ouvrir, une fenêtre de dialogue permet de choisir un fichier BMP. La validation de
"Ouvrir une
Noms des élèves : Bac. S – Spécialité ISN 4/ Créer une procédure chargée d’ouvrir le fichier BMP et de placer l’entête dans un tableau.
S’agit-il d’un tableau statique ou dynamique ? Pourquoi ? Quelle doit être la taille du tableau ?
Tableau statique car sa taille est constante et égale à 54 qui est la taille d’un entête BMP classique
5/ Créer un nouveau formulaire appelé Dialog chargé d’afficher les tailles du fichier BMP. Ajouter des labels largeurLbl, hauteurLbl et tailleLbl) permettant l’affichage de la
largeur, de la hauteur et de la taille.
6/ Créer dans la classe Dialog une fonction getTexte qui récupère les données de MainWindow :
//---
void Dialog::getTexte(QString l, QString h, QString t)
{ //affiche les données de tailles ui->largeurLbl->setText(l);
ui->hauteurLbl->setText(h);
ui->tailleLbl->setText(t);
}
7/ Dans Mainwindow appeler la fonction getTexte pour passer les trois valeurs à afficher.
void MainWindow::afficherDonneesBmp() { //ouvre la fenêtre de dialogue QString largeur, hauteur, taille;
taille=rendValeur(2);
largeur=rendValeur(18);
hauteur=rendValeur(22);
Dialog *BmpDialog = new Dialog;
BmpDialog->setWindowModality(Qt::ApplicationModal);//on rend le dialog modal
BmpDialog->getTexte(largeur,hauteur,taille);
BmpDialog->show();
}
8/ A partir des données relatives au standard BMP, trouver les numéros d’index de enteteBMP pour :
Largeur : 18,19,20 et 21 Hauteur : 22,23,24 et 25 Taille : 2,3, 4 et 5
9/ Terminer le programme de sorte que la fenêtre de dialogue affiche les bonnes valeurs. On pourra comparer avec les données d’un logiciel de dessin.
Fichiers source
Dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "mainwindow.h"
namespace Ui {class Dialog;}
class Dialog : public QDialog {
Q_OBJECT public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void getTexte(QString l, QString h, QString t);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
Noms des élèves : Bac. S – Spécialité ISN Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui { class MainWindow;
}
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QString *nomFichierBMP;
void ouvrirFichier(QString fichier);
void afficherDonneesBmp();
void getTexte(QString &largeur,QString &hauteur, QString &taille);
QString rendValeur(int debut);
public slots:
void on_actionQuitter_triggered();
void on_actionOuvrir_triggered();
private:
Ui::MainWindow *ui;
unsigned char enteteBmp[54];
};
#endif // MAINWINDOW_H
Dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) : QDialog(parent),
ui(new Ui::Dialog) {
ui->setupUi(this);
MainWindow m;
}
Dialog::~Dialog() {
delete ui;
}
//---
void Dialog::getTexte(QString l, QString h, QString t) { //affiche les données de tailles
ui->largeurLbl->setText(l);
ui->hauteurLbl->setText(h);
ui->tailleLbl->setText(t);
}
Noms des élèves : Bac. S – Spécialité ISN Main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "ui_dialog.h"
#include <QtWidgets/QFileDialog>
#include <QDebug>
#include <math.h>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this);
}
MainWindow::~MainWindow() {
delete ui;
}
//--- void MainWindow::on_actionQuitter_triggered()
{
//pour quitter le programme alt+X est le raccourcis close();
}
//--- void MainWindow::on_actionOuvrir_triggered()
{
QString nomFichierBmp = "";
nomFichierBmp=QFileDialog::getOpenFileName(this, "Ouvrir une image", QString(), "Images (*.bmp)");
ouvrirFichier(nomFichierBmp);
afficherDonneesBmp();
}
//--- void MainWindow::ouvrirFichier(QString fichier)
{//Ouvre le fichier et place l'entête dans le tableau d'entête QFile fichierBmp(fichier);
fichierBmp.open(QIODevice::ReadOnly);
fichierBmp.read((char *)enteteBmp,sizeof(enteteBmp));
}
//--- void MainWindow::afficherDonneesBmp()
{ //ouvre la fenêtre de dialogue QString largeur, hauteur, taille;
taille=rendValeur(2);
largeur=rendValeur(18);
hauteur=rendValeur(22);
Dialog *BmpDialog = new Dialog;
BmpDialog->setWindowModality(Qt::ApplicationModal);//on rend le dialog modal
BmpDialog->getTexte(largeur,hauteur,taille);
BmpDialog->show();
Noms des élèves : Bac. S – Spécialité ISN //---
QString MainWindow::rendValeur(int debut)
{ //rend en QString le nombre correspondant commencant à début et terminant à debut+4
long temp=0;
for (int i=debut;i<debut+4;i++)
temp=temp+enteteBmp[i]*pow(256,(i-debut));
return QString::number(temp);
}