2009-10-11 19 views
4

Comment enregistrer un fichier avec transparence dans un fichier JPEG sans Qt rendant la couleur transparente noire? Je sais que JPEG ne supporte pas l'alpha, et le noir est probablement juste une valeur par défaut "0" pour alpha, mais le noir est une horrible couleur par défaut.Qt: QImage enregistre toujours les couleurs transparentes en noir

Il semble que ce soit une opération simple, mais toutes les fonctions alpha et masques que j'ai essayées sont ignorées lors de l'enregistrement au format JPEG.

Par exemple:

image->load("someFile.png"); // Has transparent background or alpha channel 
image->save("somefile.jpg", "JPG"); // Transparent color is black 

J'ai essayé de remplir l'image avec le blanc avant d'enregistrer en JPEG, convertir l'image en ARGB32 (avec canal alpha 8 bits) avant d'enregistrer, et même essayé ridiculement lent des trucs comme:

QImage image2 = image1->convertToFormat(QImage::Format_ARGB32); 
image2.setAlphaChannel(image1->alphaChannel()); 
image2.save(fileURI, "JPG", this->jpgQuality; // Still black! 


See: http://67.207.149.83/qt_black_transparent.png for a visual. 

Répondre

9

Je vais essayer quelque chose comme ça (par exemple, charger l'image, créer une autre image de la même taille, la peinture backgr ound, peindre l'image):

QImage image1("someFile.png"); 
QImage image2(image1.size()); 
image2.fill(QColor(Qt::white).rgb()); 
QPainter painter(&image2); 
painter.drawImage(0, 0, image1); 
image2.save("somefile.jpg", "JPG"); 
+0

Ce code m'a mis sur la bonne voie. Votre idée d'utiliser le QPainter pour peindre l'image entrante sur un fond blanc dessiner manuellement a fonctionné. Vous avez mes remerciements. J'aurais aimé qu'il y ait un moyen plus rapide de le faire, mais pour l'instant je suis content que cela fonctionne. –

+0

Eh bien, le moyen le plus rapide est probablement de le faire vous-même. Vous pouvez utiliser 'bits()' pour obtenir les données brutes, les parcourir, vérifier si 'qAlpha()' d'un pixal est inférieur à 255, mélanger la couleur avec le blanc. –

+0

Je ne sais pas quelle version de Qt ce code utilisait à l'époque (4.5, 4.6?) Mais maintenant 5 ans plus tard (!) Dans Qt 4.8 et Qt 5.x, le constructeur de QImage prend une QSize [nécessite de passer un format aussi] (http://qt-project.org/doc/qt-4.8/qimage.html#QImage-2). Il existe une nouvelle méthode de remplissage qui prend [une couleur Qt :: Global] (http://qt-project.org/doc/qt-4.8/qimage.html#fill-2). – Uflex

-2

Jpeg ne supporte pas la transparence

+2

Je sais (voir deuxième phrase). Je veux juste qu'il sauve la transparence en blanc, plutôt qu'en noir. –

-2

True si vous voulez utiliser Alpha Chanel (transparent), vous devez enregistrer le Imge dans * .png * .bmp formats

+2

S'il vous plaît lisez la question complètement - je mentionne que je suis conscient que JPG ne supporte pas la transparence dans la deuxième phrase. Ni le * .bmp, au fait. Le problème était que, lors de l'enregistrement en JPEG * à partir * d'une image avec transparence, les valeurs transparentes sont interprétées en noir. –