C++ Qt:QImage始终将透明颜色保存为黑色
如何将透明文件保存为JPEG文件,而不使透明颜色变为黑色? 我知道JPEG不支持alpha,黑色可能只是alpha的默认“0”值,但黑色是一种可怕的默认颜色 看起来这应该是一个简单的操作,但是当保存为JPEG时,我尝试过的所有掩码和alpha函数都被忽略了 例如:C++ Qt:QImage始终将透明颜色保存为黑色,c++,qt,transparency,qimage,C++,Qt,Transparency,Qimage,如何将透明文件保存为JPEG文件,而不使透明颜色变为黑色? 我知道JPEG不支持alpha,黑色可能只是alpha的默认“0”值,但黑色是一种可怕的默认颜色 看起来这应该是一个简单的操作,但是当保存为JPEG时,我尝试过的所有掩码和alpha函数都被忽略了 例如: image->load("someFile.png"); // Has transparent background or alpha channel image->save("somefile.jpg", "JPG");
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.
Jpeg不支持透明度我会尝试类似的方法(即加载图像,创建另一个相同大小的图像,绘制背景,绘制图像):
如果要使用Alpha Chanel(透明),则应以*.png*.bmp格式保存imgeI know(参见第二句)。我只是想把透明度保存为白色,而不是黑色。这段代码让我走上了正确的轨道。您使用QPaint在手动绘制的白色背景上绘制传入图像的想法已经奏效。谢谢你。我希望有一个更快的方法来做到这一点,但现在我满足于它的工作。嗯,最快的方法可能是自己做。您可以使用
bits()
获取原始数据,对其进行迭代,检查pixal的qAlpha()
是否低于255,将颜色与白色混合。我不知道这段代码当时使用的是什么版本的Qt(4.5,4.6?),但5年后的今天(!)在Qt4.8和Qt5.x中,QImage的构造函数采用了QSize。还有一种新的填充方法。请完整地阅读问题——我提到我知道JPG在第二句中不支持透明度。顺便说一句,bmp也是。问题是,当从具有透明度的图像保存为JPEG*时,透明值被解释为黑色。
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");