L'affichage et le dimensionnement d'une échelle de gris à partir d'une QImage dans Qt
J'ai été en mesure d'afficher une image dans une étiquette dans Qt en utilisant quelque chose comme ce qui suit:
transformPixels(0,0,1,imheight,imwidth,1);//sets unsigned char** imageData
unsigned char* fullCharArray = new unsigned char[imheight * imwidth];
for (int i = 0 ; i < imheight ; i++)
for (int j = 0 ; j < imwidth ; j++)
fullCharArray[(i*imwidth)+j] = imageData[i][j];
QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);
ui->viewLabel->setPixmap(QPixmap::fromImage(*qi,Qt::AutoColor));
Donc fullCharArray est un tableau de unsigned caractères qui ont été cartographiés à partir de la 2D matrice de données images, en d'autres termes, il est imheight * imwidth octets.
Le problème est, il semble que seulement une partie de mon image s'affiche dans le label. L'image est très grande. Je voudrais afficher l'image complète, réduite pour s'adapter à l'étiquette, avec le ratio d'aspect préservé.
Aussi, que QImage format était la seule que j'ai pu trouver qui semblait me donner une représentation proche de l'image, je suis désireux de l'affichage, c'est que ce que je devrais attendre? Je suis seulement en utilisant un octet par pixel (unsigned char - les valeurs de 0 à 255), et il semble qu'RGB32 ne fait pas beaucoup de sens pour ce type de données, mais aucun de ceux affichés quelque chose à distance correcte
edit:
Suivant dan gallaghers conseils, j'ai mis en place ce code:
QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);
int labelWidth = ui->viewLabel->width();
int labelHeight = ui->viewLabel->height();
QImage small = qi->scaled(labelWidth, labelHeight,Qt::KeepAspectRatio);
ui->viewLabel->setPixmap(QPixmap::fromImage(small,Qt::AutoColor));
Mais cela provoque mon programme "de façon inattendue finir" avec le code 0
- Selon la documentation de QImage::Format_RGB32 semble être 8bit/couleur + 8bit rembourrage pour faire de 32 bits pour la fabrication de travailler avec les plus faciles, donc, comment n'a pas de sens pour 8bit/couleur données?
Vous devez vous connecter pour publier un commentaire.
QImage
a unscaled
membre. Si vous souhaitez modifier votresetPixmap
appel à quelque chose comme:Noter que
scaled
ne modifie pas l'image d'origineqi
; elle renvoie une nouvelleQImage
qui est à l'échelle de la copie de l'original.Re-Edit:
Pour convertir à partir de 1 octet en niveaux de gris sur 4 octets RVB en niveaux de gris:
Puis à l'échelle
qi
et l'utilisation de l'échelle copie comme le pixmap pourviewLabel
.fullCharArray
), vous devriez essayer d'utiliserQImage::setPixel
. Vous initialiser leQImage
avec le bonimwidth
etimheight
, puis la boucle au-dessus de votreimageData
tableau, mais utiliserqi->setPixel(i, j, QRgb(imageData[i][j], imageData[i][j], imageData[i][j]))
.Qt ne prend pas en charge les niveaux de gris de l'image de la construction directement. Vous avez besoin d'utiliser 8 bits couleurs indexées image:
J'ai aussi rencontré de problème similaire - QImage::échelle retourné noir des images. Le travail rapide-autour de ce qui a fonctionné dans mon cas était de convertir QImage pour QPixmap, de l'échelle et de revenir ensuite. Comme ceci:
où "l'image" est l'image d'origine.
Je n'étais pas au courant de format-problème, avant la lecture de ce thread, mais en effet, mes images sont de 1 Bit (noir et blanc).
Ce qui concerne,
Valentin Heinitz