JPEG не имеет никакого понятия об альфа-канале или прозрачности вообще. Альфа-канал обрезается во время преобразования в JPEG. BMP имеет такое же ограничение.
Поскольку прозрачность важна для вас, ваша программа должна придерживаться генерации PNG.
Что касается вопроса, который вы задали в заголовке, удаление альфа-канала можно выполнить вручную. Хитрость заключается в понимании того, как хранятся данные в GdkPixbuf. Если у вас есть RGB pixbuf с альфа-каналом (также называемый RGBA), пиксели сохраняются в виде 32-битных значений: 4 байта, один байт на цвет, четвертый - альфа-канал. Пиксельные буферы RGB хранятся в виде 24-битных значений, по одному байту на цвет.
Итак, если вы создаете временный байтовый буфер и копируете первые три байта каждого пикселя RGBA и отбрасываете четвертый, тогда этот временный буфер будет чисто RGB. Чтобы представить это немного:
[R] [G] [B] [A] [R] [G] [B] [A] ... => [R] [G] [B] [R] [G] [B] ...
Обратите внимание, что вы должны упаковать временный буфер; между байтом [B] и следующим байтом [R] нет запасного байта.
Затем вы создаете новый GdkPixbuf, передавая ему этот буфер RGB, и вы удаляете альфа-канал.
См. Gdk_pixbuf_get_pixels () для доступа к буферу RGBA и gdk_pixbuf_new_from_data () для создания пиксельного буфера RGB. См. здесь для получения дополнительной информации о том, как упакованные данные хранятся в GdkPixbuf. * 1017 *