diff --git a/Userland/Utilities/image.cpp b/Userland/Utilities/image.cpp index 71ef6ffb02..c47fb42230 100644 --- a/Userland/Utilities/image.cpp +++ b/Userland/Utilities/image.cpp @@ -30,6 +30,9 @@ ErrorOr serenity_main(Main::Arguments arguments) int frame_index = 0; args_parser.add_option(frame_index, "Which frame of a multi-frame input image (0-based)", "frame-index", {}, "INDEX"); + bool move_alpha_to_rgb = false; + args_parser.add_option(move_alpha_to_rgb, "Copy alpha channel to rgb, clear alpha", "move-alpha-to-rgb", {}); + bool ppm_ascii = false; args_parser.add_option(ppm_ascii, "Convert to a PPM in ASCII", "ppm-ascii", {}); @@ -61,6 +64,31 @@ ErrorOr serenity_main(Main::Arguments arguments) auto frame = TRY(decoder->frame(frame_index)).image; + if (move_alpha_to_rgb) { + switch (frame->format()) { + case Gfx::BitmapFormat::Invalid: + case Gfx::BitmapFormat::Indexed1: + case Gfx::BitmapFormat::Indexed2: + case Gfx::BitmapFormat::Indexed4: + case Gfx::BitmapFormat::Indexed8: + warnln("Can't --strip-alpha with indexed or invalid bitmaps"); + return 1; + case Gfx::BitmapFormat::RGBA8888: + // No image decoder currently produces bitmaps with this format. + // If that ever changes, preferrably fix the image decoder to use BGRA8888 instead :) + // If there's a good reason for not doing that, implement support for this, I suppose. + warnln("Can't --strip-alpha not implemented for RGBA8888"); + return 1; + case Gfx::BitmapFormat::BGRA8888: + case Gfx::BitmapFormat::BGRx8888: + // FIXME: If BitmapFormat::Gray8 existed (and image encoders made use of it to write grayscale images), we could use it here. + for (auto& pixel : *frame) { + u8 alpha = pixel >> 24; + pixel = 0xff000000 | (alpha << 16) | (alpha << 8) | alpha; + } + } + } + if (strip_alpha) { switch (frame->format()) { case Gfx::BitmapFormat::Invalid: