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.
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. –
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. –
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