Voila ce que j'ai mis mais ça marche pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QDataStream::SetByteOrder(QDataStream::LittleEndian) ; QDataStream in (&file);//Lecture des données contenues dans le fichier.
Voila ce que j'ai mis mais ça marche pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QDataStream::SetByteOrder(QDataStream::LittleEndian) ; QDataStream in (&file);//Lecture des données contenues dans le fichier.
Mets ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QDataStream in (&file); in.SetByteOrder(QDataStream::LittleEndian);
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
Impeccable et merci les guars j'ai les bonnes valeurs, il me reste encore un long chemin à faire car je dois afficher mon image dans un QLabel.Vu que là que connais le nombre de lignes et de colonnes de mon image ainsi que la taille des commentaires inclus dans le fichier image, je peux créer un buffer en calculant la taille de l'image = NbLignes * NbColonnes et ensuite je stocke tous mes pixels en commençant à lire mon fichier à partir de l'adresse qui vient juste aprés les commentaires. Ma question pour commencer est que j'ai trouvé la taille du commentaire 309 j'espere que c'est en Octet??Si oui est ce que je peux me placer à l'dresse qui suit pour lire mes pixels de l'image en faisant:
Merci d'avance de votre participation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 file.seek(309) ; QDataStream in (&file) ; QImage image ; in >> image ; label->setPixmap(QPixmap::fromImage(image)) ;
y as de forte chance
Comment Qt pourrai connaitre la taille la façon de lire ton image??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2QImage image ; in >> image ;
il faut que tu fasse cela en deux étape :
1- tu créé une QImage à une taille donné
2- tu li tes pixels et les copie dans la QImage. Pour commencer utilise la fonction setPixel http://qt.developpez.com/doc/4.5/qimage/#setpixel-2.
Une fois que tu aura réussi tu pourra faire des optimisations (setPixel est lent). Mais chaque chose en son temps
Ca c'est bon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 label->setPixmap(QPixmap::fromImage(image)) ;
Salut,
Je ne sais pas si ca vaut le coup ou pas en terme de rapidité, mais peut etre que recreer un bmp a partir de ton fxd serait utile.
Quand tu dis "les valeurs des pixels", si c'est en rgb, tu as juste a reorganiser les données pour transformer ton fxd en bmp, et ensuite tu pourrais afficher le bmp dans ton label.
Je ne suis pas sur que ce soit plus rapide vu qu'il faille recréer un fichier (temps d'ecriture sur le disque dur), a moins que ce soit possible de créer un fichier "virtuel" (qui reste en ram sans etre ecrit sur le disque dur) mais la je ne sais pas...
Bonjour, j'ai un probléme pour afficher mon image dans le QLabel.Apres une lecture de mon fichier, je connais par où je dois commencer à lire mes pixels mais j'ai du mal à créer un buffer et a y stocker les pixels et ensuite afficher mon image. Voici mon bout de code:
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
25
26
27
28 void Maclass::ReadImage() { QFile file ; // QImage image ; QByteArray byteArray ; //(nom = (type*) calloc (nombre, sizeof(type) ) ) == NULL ) isize = 1500 * 1800 * 4 ; //Taille de l'image en Octet.4 étant la taille d'un Octet car l'image est codé sur 4 Octet. char* image = (char*) malloc(isize) ; //Allocation dynamique ou Buffer pour stocker les données qui seront lues. if((image) == 0) //Tester pour verifier que l'espace memoire est bien reserve. { QMessageBox::information(this, tr("Image Viewer"),tr("").append("Impossible de reserver la memoire")) ; } QMessageBox::information(this, tr("Image Viewer"),tr("la taille de l'iamge est %1").arg(sizeof(image))) ; file.seek(128 + CommentLength) ; //Je me positionne à la fin des commentaires et au début des pixels de l'image pour faire la lecture. file.read(image, isize) ; //Je lis les données du fichier et je les stocke dans image en précisant la taille de image. //Comment afficher les pixels en image dans un QLabel ?? ui->ZoneImage->setPixmap(QPixmap::loadFromData(image,QImage::Format_ARGB32,Qt::gray)) ; }
J'ai pensé aussi à faire ceci mais rien ne marche, aidez moi svp c'est ça fait 2 jours que je galére je pense que ya quelque chose qui m'échappe:
merci d'avance
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 QFile file ; file.seek(128 + CommentLength) ;//Adresse de début de lecture des pixels. int sizeImage = 1500 * 1800 * 4 ;//Calcul de la taille de l'image:rows * columns * PixelType QByteArray byteArray ; //Declare un tableau pour y stocker les données de l'image. byteArray.resize(sizeImage) ;//redimensionne le tableau à la meme taille que l'image. QDataStream in (&file) ; in >> byteArray ;//On met les données dans le tableau. QBuffer buffer(&byteArray) ;//On met le tableau dans un buffer. //Maintenant il faut lire le buffer pour écrire l'image dans un QLabel. //ui->ZoneImage->setPixmap(byteArray,QImage::Format_ARGB32) ; }
Tu crées une QImage a l'aide de ce constructeur QImage::QImage ( uchar * data, int width, int height, Format format ). C'est de lien qu'a donné yan dans un poste en page 1.
Si je ne me trompe pas cela devrait marché a peut pres comme ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 QImage uneImage(image , 1800, 1500, QImage::Format_ARGB32) ; ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
Verifie que je n'ai pas entervertie la largeur et la longeur et ausi la format de l'image si c'est le bon.
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
Bonjour, j'ai essayé avec le constructeur QImage::QImage ( uchar * data, int width, int height, Format format )
Mais j'ai cette erreur:
Bizarre car mon image est bien un char, est ce je dois faire un cast de char à uchar??
Code : Sélectionner tout - Visualiser dans une fenêtre à part error: call of overloaded `QImage(char*&, int, int, QImage::Format)' is ambiguous
Je voudrais savoir aussi si ma fonction file.read(image, isize) fait bien ce que je pense car je suis pas sur et aussi si c'est possible que image soit un char?
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 typedef char* uchar ; isize = 1500 * 1800 * 4 ; //Taille de l'image en Octet.4 étant la taille d'un Octet car l'image est codé sur 4 Octet. uchar image = (char*) malloc(isize) ; //Allocation dynamique ou Buffer pour stocker les données qui seront lues. if((image) == 0) //Tester pour verifier que l'espace memoire est bien reserve. { QMessageBox::information(this, tr("Image Viewer"),tr("").append("Impossible de reserver la memoire")) ; } QMessageBox::information(this, tr("Image Viewer"),tr("la taille de l'iamge est %1").arg(sizeof(image))) ; file.seek(128 + CommentLength) ; //Je me positionne à la fin des commentaires et au début des pixels de l'image pour faire la lecture. file.read(image, isize) ; //Je lis les données du fichier et je les stocke dans image en précisant la taille de image. //Comment afficher les pixels en image dans un QLabel QImage uneImage(image , 1800, 1500, QImage::Format_ARGB32) ; ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage)); } }
uchar est un type Qt. et c'est plutot un typedef unsigned char qu'un typedef char*.
En esperant cette fois que cela marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 char* image = (char*) malloc(isize); QImage uneImage((uchar*)image , 1800, 1500, QImage::Format_ARGB32) ; ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
je te le reconseil, utilise dans un premier temps setPixel.
Tu auras bien moins de problème.
/!\ si tu donne un buffer à QImage, il s'en servira mais ne s'occupera pas de sa destruction. Dans vos code, y as fuite mémoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 QImage uneImage(w, h, QImage::Format_ARGB32) for(int y = 0 ;y < h ; ++y) for(int x = 0 ; x < w;++w) { uneImage.setPixel(x,y,...); } ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
Je comprends pas trop elle est ou la fuite memoire ?
Si tu fais ça il y a encore une fuite memoire pour toi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage)); free(image);
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
tu ne fait pas de destruction de image. Lorsque tu donne ce pointeur à QImage, il va juste l'utiliser. PMais ne va pas le détruire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part char* image = (char*) malloc(isize);
En plus le buffer doit avoir la taille de ses ligne aligné sur 32. Il faut donc parfois allouer de la mémoire inutile en plus.
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
tout est dans la doc
http://qt.developpez.com/doc/4.5/qimage/#qimage-4
la taille mémoire d'une ligne doit être un multiple de 32bits (ou 4 octet). Je ne connait pas trop les raison mais c'est lié au structure d'affichage des os.Constructs an image with the given width, height and format, that uses an existing read-only memory buffer, data. The width and height must be specified in pixels, data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.
par exemple, une image de 33*33:
si ta taille en octet d'une ligne n'est pas multiple de 4, tu augmente cette taille. Tu as donc pour chaque ligne de la mémoire inutilisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //taille en octet d'une ligne int taille_ligne : 33*sizeof(pixel); //si cette taille n'est pas un multiple de 4 octet //on prend le multiplie supérieur if((taille_ligne % 4)!=0) taille_ligne = (33/4+1)*4;
Quand tu donne donne un buffer à QImage, c'est à toi de gérer sa vie et non au QImage. Si tu détruit ce buffer mais que tu utilise encore la QImage t'auras aussi un problème
The buffer must remain valid throughout the life of the QImage. The image does not delete the buffer at destruction.
Merci yan de ces précisions. J'avais pas vu en fait qu'il fallait gerer la vie du buffer soi meme et qu'il etait dependant de la QImage.
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
Bonjour, aprés une journée de travailler je me retrouve toujours avec le meme probléme car j'arrive toujours pas à afficher l'image mais j'ai pas mal progressé en tant que debutant donc je vous remercie de votre aideet de vos conseils, voici où j'en suis:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 QFile file("C:/Documents and Settings/Image.fxd") ; if(!file.open(QIODevice::ReadOnly)) //On ouvre le fichier en lecture seule { QMessageBox::information(this, tr("Image Viewer"), tr("Cannot Open %1.").arg(FileName)); } else { QMessageBox::information(this, tr("Image Viewer"), tr("File succesfull Open %1.").arg(FileName)); file.seek(0) ; QDataStream in(&file);//Lecture des donnees contenues dans le fichier. in.setByteOrder(QDataStream::LittleEndian) ;//Pour lire dans le bon ordre et avec le bon format des donnees. in >> FileMagic >> rows >> columns >> CommentLength; QMessageBox::information(this, tr("Image Viewer"), tr("the number of the File Magic is%1.").arg(FileMagic),tr("the number of the rows is%1.").arg(rows),tr("the number of the columns is%1.").arg(columns) ); QMessageBox::information(this, tr("Image Viewer"), , tr("the length of the comment is%1.").arg(CommentLength) ) ; int Lengthdata = rows * columns ;//taille de . QMessageBox::information(this, tr("Image Viewer"),tr("the length of the data is%1.").arg(Lengthdata)); file.seek(128 + CommentLength) ; //Je me positionne a la fin des commentaires et au debut des pixels de l'image pour faire la lecture. //Premierement je crée une QImage à la taille de mon image. QImage uneImage(rows, columns, QImage::Format_ARGB32) ; for(int y = 0 ;y < rows ; ++y ) { for(int x = 0 ; x < columns; ++x ) { uneImage.setPixel(x,y,QImage::Format_ARGB32); } } //Deuxiément je lis les pixels et je les mets dans le QImage crée. in >> uneImage ; ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
Et voici les erreurs que Qt m'affiche:
.........
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
25
26
27 QImage::setPixel: coordinate (0,1500) out of range QImage::setPixel: coordinate (1,1500) out of range QImage::setPixel: coordinate (2,1500) out of range QImage::setPixel: coordinate (3,1500) out of range QImage::setPixel: coordinate (4,1500) out of range QImage::setPixel: coordinate (5,1500) out of range QImage::setPixel: coordinate (6,1500) out of range QImage::setPixel: coordinate (7,1500) out of range QImage::setPixel: coordinate (8,1500) out of range QImage::setPixel: coordinate (9,1500) out of range QImage::setPixel: coordinate (10,1500) out of range QImage::setPixel: coordinate (11,1500) out of range QImage::setPixel: coordinate (12,1500) out of range QImage::setPixel: coordinate (13,1500) out of range QImage::setPixel: coordinate (14,1500) out of range QImage::setPixel: coordinate (15,1500) out of range QImage::setPixel: coordinate (16,1500) out of range QImage::setPixel: coordinate (17,1500) out of range QImage::setPixel: coordinate (18,1500) out of range QImage::setPixel: coordinate (19,1500) out of range QImage::setPixel: coordinate (20,1500) out of range QImage::setPixel: coordinate (21,1500) out of range QImage::setPixel: coordinate (22,1500) out of range QImage::setPixel: coordinate (23,1500) out of range QImage::setPixel: coordinate (24,1500) out of range QImage::setPixel: coordinate (25,1500) out of range QImage::setPixel: coordinate (26,1500) out of range
ainsi de suite pour toute la taille jusqu'à 1499 et 1799.
Bizarre pour moi car je vois pas l'erreur,aider moi svp
La fonction setPixel() comme son nom l'indique sert a donner une valeur a un pixel de l'image. Tu l'utilise mal il faut que tu donnes une valeur a ses pixel. Normalement sa correspond a ce que tu as trouvé dans ton fichier binaire. La valeur du pixel est un unint qui correspond directement a une valeur RGBA.
Exemple pour un pixel:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 QRgb value; value = qRgba(189, 149, 39,0); uneImage.setPixel(x,y,value);
Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
N'hésitez pas à me contacter par MP.
C'est bizarre j'ai une image codé en float c'est à dire 32 bits par pixel et tu me dit que la valeur d'un pixel c'est un uint ??tu peux expliquer stp
En plus comme je l'ai montré dans mon code je lis des valeurs dans un fichier et à partir d'une certaine position, donc c'est vraiment chaud je vois pas comment mettre chaque valeur dans un setpixel(int,int uint) à moins que je les stoque dans un tableau byteArray?est ce une possibilité??
Merci d'avance
pourquoi faire??
Code : Sélectionner tout - Visualiser dans une fenêtre à part file.seek(0) ;
ce ne serai pas plutôt uneImage(columns, rows , QImage::Format_ARGB32) ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part QImage uneImage(rows, columns, QImage::Format_ARGB32) ;
???? comment veut tu que QT sache lire tes pixel à ta place????
Code : Sélectionner tout - Visualiser dans une fenêtre à part in >> uneImage ;
Le setpixel sert à donner tes pixel à l'image (voir réponse de superjaja)
c'est des float???????? il faut être précis.C'est bizarre j'ai une image codé en float
qu'es ce qui t'empêche de lire pixel à pixel et d'utiliser le setPixel pour le donner à ton image?je vois pas comment mettre chaque valeur dans un setpixel(int,int uint)
oui mais j'ai une image en niveau de gris c'est à dire sans couleur , est ce toujours possible avec setpixel?
et est ce que je peux utiliser file.read(monfichier.seek(i)) pour lire les pixels de l'image dans le fichier en faisant une boucle
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager