Qt: QImage всегда сохраняет прозрачный цвет как черный

Как сохранить файл с прозрачностью в файл JPEG без того, чтобы Qt сделал прозрачный цвет черным? Я знаю, что JPEG не поддерживает альфу, и черный, вероятно, просто значение «0» по умолчанию для альфы, но черный цвет по умолчанию ужасен.

Кажется, что это должна быть простая операция, но все функции маски и альфа-канала, которые я пробовал, игнорируются при сохранении в формате JPEG.

Например:

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

Я пытался заполнить изображение белым цветом перед сохранением в формате JPEG, преобразовать изображение в формат ARGB32 (с 8-битным альфа-каналом) перед сохранением и даже пробовал смехотворно медленные вещи, такие как:

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.

person Charles Burns    schedule 11.10.2009    source источник


Ответы (3)


Я бы попробовал что-то вроде этого (т. е. загрузить изображение, создать другое изображение того же размера, нарисовать фон, нарисовать изображение):

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");
person Lukáš Lalinský    schedule 11.10.2009
comment
Этот код привел меня на правильный путь. Ваша идея использовать QPainter для рисования входящего изображения на белом фоне, нарисованном вручную, сработала. Примите мою благодарность. Хотелось бы, чтобы был более быстрый способ сделать это, но пока я доволен тем, что он вообще работает. - person Charles Burns; 12.10.2009
comment
Ну, самый быстрый способ, вероятно, сделать это самостоятельно. Вы можете использовать bits(), чтобы получить необработанные данные, перебрать их, проверить, меньше ли qAlpha() пикселя 255, смешать цвет с белым. - person Lukáš Lalinský; 12.10.2009
comment
Я не знаю, какую версию Qt этот код использовал тогда (4.5, 4.6?), но теперь, 5 лет спустя (!) в Qt 4.8 и Qt 5.x, конструктор QImage принимает QSize также требует передачи формата. Существует новый метод заливки, который принимает цвет Qt::Global также. - person Uflex; 16.01.2014

Jpeg не поддерживает прозрачность

person Martin Beckett    schedule 11.10.2009
comment
Я знаю (см. второе предложение). Я просто хочу, чтобы прозрачность оставалась белой, а не черной. - person Charles Burns; 11.10.2009

Правда, если вы хотите использовать Alpha Chanel (Transparent), вы должны сохранить изображение в форматах *.png *.bmp.

person Andres    schedule 28.06.2010
comment
Пожалуйста, прочитайте вопрос полностью - я упоминаю, что знаю, что JPG не поддерживает прозрачность во втором предложении. Кстати, .bmp тоже. Проблема заключалась в том, что при сохранении в JPEG *из изображения с прозрачностью прозрачные значения интерпретируются как черные. - person Charles Burns; 04.07.2010