Bonjour,
J'ai décidé de me mettre à Qt Graphics dans le but de montrer un exemple d'utilisation à mes élèves. J'aimerais coder un prog qui charge une carte topo IGN au 1:25000 de grande taille pour pouvoir faire des zooms et des déplacements. Je l'ai fait mais au chargement c'est très long : je charge toute l'image d'un seul coup. Du coup j'ai jeter un oeil sur le forum et sur le net et il ai dit qu'il faut mettre en place un système de tuiles avec un thread qui s'occupe de charger les tuiles (et un peu plus) pour la vue en cours et d'actualiser ceci quand on déplace.
Sur le principe/théorie je comprend mais j'ai du mal à voir par quoi commencer et comment procéder concrètement (codage). Habituellement je me débrouille seul mais là je trouve que les exemples du net ne sont pas très précis.
Comment peut-on récupérer une zone rectangulaire directement dans un fichier image sans charger toute l'image ?
Comment doit-on gérer les tuiles (tableau 2 dim, QMap, etc.. ) ?
Comment se passe la demande d'actualisation (Thread) ?
Voilà je me pose toutes ces questions qui sont peut-être encore un peu vague.
Si quelqu'un à un tuto plus précis et/ou un exemple de code à me fournir qui ressemble à ce que je veux faire, un peu comme google maps, ce serait très sympa.
Merci d'avance.
Edit :
Bon j'ai commencé à faire le système de tuiles mais j'ai vu que l'on pouvait également utiliser la classe QImageReader et la méthode setClipRect(..).
Du coup j'ai fait un prog tout simple qui me capture 2 zones de 512*512 chacune dans ma carte topo de 5000*4000 pour ensuite les placer dans ma vue.
Ma vue fait 512*512, ma scene fait 1536*1536. Mais le problème est lorsque je lis une deuxieme fois dans le QImageReader j'ai une erreur :
"Unable to read image data". Le code est 4 : QImageReader::InvalidDataError 4 The image data was invalid, and QImageReader was unable to read an image from it. The can happen if the image file is damaged.
l me faut créer un deuxeme QImageReader pour faire une deuxième capture....je trouve ça un peu lourd. J'ai certainement du merder quelque part mais où......je ne vois pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 QImageReader reader("./cartes/carte.png"); reader.setClipRect(QRect(0,0,512,512)); QImage monImage = reader.read(); if(monImage.isNull()) qDebug()<<"error image"<<endl; reader.setClipRect(QRect(512,0,512,512)); QImage monImage2 = reader.read(); if(monImage2.isNull()) qDebug()<<"error image2 : "<<reader.error()<<" / "<<reader.errorString()<<endl; QPixmap monPixmap = QPixmap::fromImage(monImage); QGraphicsPixmapItem * itemPixmap = new QGraphicsPixmapItem(monPixmap); scene.addItem(itemPixmap);//*/ QPixmap monPixmap2 = QPixmap::fromImage(monImage2); QGraphicsPixmapItem * itemPixmap2 = new QGraphicsPixmapItem(monPixmap2); itemPixmap2->setOffset(512,0); scene.addItem(itemPixmap2);//*/
Ce code fonctionne mais il est lourd :
Je ne vois pas comment faire.....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 QImageReader reader("./cartes/carte.png"); reader.setClipRect(QRect(0,0,512,512)); QImage monImage = reader.read(); if(monImage.isNull()) qDebug()<<"error image"<<endl; QImageReader reader2("./cartes/carte.png"); // On doit pouvoir ne pas recréer cet objet !????!!!!????? reader2.setClipRect(QRect(512,0,512,512)); QImage monImage2 = reader2.read(); if(monImage2.isNull()) qDebug()<<"error image2 : "<<reader2.error()<<" / "<<reader2.errorString()<<endl; QPixmap monPixmap = QPixmap::fromImage(monImage); QGraphicsPixmapItem * itemPixmap = new QGraphicsPixmapItem(monPixmap); scene.addItem(itemPixmap);//*/ QPixmap monPixmap2 = QPixmap::fromImage(monImage2); QGraphicsPixmapItem * itemPixmap2 = new QGraphicsPixmapItem(monPixmap2); itemPixmap2->setOffset(512,0); scene.addItem(itemPixmap2);//*/
Partager