Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:QImage始终将透明颜色保存为黑色_C++_Qt_Transparency_Qimage - Fatal编程技术网

C++ Qt:QImage始终将透明颜色保存为黑色

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");

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

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

例如:

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格式保存imge

I 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");