2009-10-11 787 views
4

如何将不透明的文件保存为JPEG文件而不使Qt透明色变为黑色? 我知道JPEG不支持alpha,黑色可能只是alpha的默认“0”值,但黑色是一种可怕的默认颜色。Qt:QImage总是将透明色保存为黑色

看起来这应该是一个简单的操作,但所有我尝试过的mask和alpha函数在保存为JPEG时都会被忽略。

例如:

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

我试图保存为JPEG,保存之前的图像转换为ARGB32(8位alpha通道)之前填充有白色的图像,甚至试图可笑慢这样的东西:

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. 

回答

9

我会尝试这样的事情(即加载图像,创建一个同样大小的另一种形象,烤漆backgr ound,绘制图像):

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

这段代码让我走上了正轨。您使用QPainter在手动绘制白色背景上绘制传入图像的想法很奏效。你有我的感谢。 我希望有一个更快的方法来做到这一点,但现在我满足于它的作品。 – 2009-10-12 06:16:38

+0

好吧,最快的方法可能是自己做。您可以使用bits()来获取原始数据,迭代它,检查像素的qAlpha()是否低于255,将颜色与白色混合。 – 2009-10-12 06:38:39

+0

我不知道该代码当时使用的是什么版本(4.5,4.6?),但现在5年后(Qt 4.8和Qt 5.x),QImage的构造函数需要QSize [需要通过格式以及](http://qt-project.org/doc/qt-4.8/qimage.html#QImage-2)。还有一种新的填充方法[采用Qt :: Global颜色](http://qt-project.org/doc/qt-4.8/qimage.html#fill-2)。 – Uflex 2014-01-16 15:01:05

-2

Jpeg格式不支持透明度

+2

我知道(见第二句)。我只是希望它将透明度保存为白色而不是黑色。 – 2009-10-11 05:58:28

-2

真,如果你想使用阿尔法香奈儿(透明),你应该保存在IMGE *巴纽* .BMP格式

+2

请完整阅读该问题 - 我提到,我知道JPG不支持第二句中的透明度。顺便说一句,* .bmp也不是。 问题在于,当从透明图像保存为JPEG *时,透明值被解释为黑色。 – 2010-07-04 06:10:11