Я использую Magick ++ API ImageMagick в C ++ для уменьшения изображения RGBA вдвое.
Magick::Image input(input_file);
input.flip();
input.resize(Magick::Geometry(image.px_width, image.px_height));
Magick::Blob blob;
input.write(&blob, "RGBA");
//input.write("out.png"); // Behaves the same
Исходное изображение
Исходный файл: https://i.stack.imgur.com/BoYyH.png
RGBA с прозрачностью альфа: https://i.stack.imgur.com/MuGQm.png
Только каналы RGB: https://i.imgur.com/1ZRp2K9.png
Только альфа-канал: https://i.imgur.com/gpjTxVJ.png
Обратите внимание на три цветные точки и каналы RGB, где альфа-канал равен нулю.
Выходное изображение
RGBA с прозрачностью альфа: https://i.imgur.com/V9aF6S5.png
Только RGB-каналы: https://i.imgur.com/ERIbiMS.png
Альфа-канал правильный.
Три точки исчезли. Кажется, что ImageMagick подумал, что, поскольку точки полностью прозрачны, он может отбросить информацию. Проблема в том, что есть ценная информация, которая теряется и нарушает изображение рендеринга, которое ожидает эти данные.
Я получаю такое же испорченное поведение, когда запускаю образ через утилиту convert
:
$ convert in.png -resize 512x512 out.png
И я смог исправить это с помощью этой команды:
$ convert in.png -channel RGBA -separate -resize 512x512 -combine out.png
Как я могу реализовать это правильное поведение с помощью Magick ++ API?