PixelPaint: Ask to preserve transparency when exporting

Previously the alpha channel was thrown away when exporting to BMP or
PNG in PixelPaint, instead let the user decide.
This commit is contained in:
Marcus Nilsson 2021-07-04 12:34:10 +02:00 committed by Andreas Kling
parent 8324ffefe7
commit 2183d01eb0
Notes: sideshowbarker 2024-07-18 10:25:27 +09:00
3 changed files with 15 additions and 11 deletions
Userland/Applications/PixelPaint

View file

@ -192,9 +192,9 @@ Result<void, String> Image::write_to_file(const String& file_path) const
return {};
}
RefPtr<Gfx::Bitmap> Image::try_compose_bitmap() const
RefPtr<Gfx::Bitmap> Image::try_compose_bitmap(Gfx::BitmapFormat format) const
{
auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, m_size);
auto bitmap = Gfx::Bitmap::create(format, m_size);
if (!bitmap)
return nullptr;
GUI::Painter painter(*bitmap);
@ -202,13 +202,14 @@ RefPtr<Gfx::Bitmap> Image::try_compose_bitmap() const
return bitmap;
}
Result<void, String> Image::export_bmp_to_file(String const& file_path)
Result<void, String> Image::export_bmp_to_file(String const& file_path, bool preserve_alpha_channel)
{
auto file_or_error = Core::File::open(file_path, (Core::OpenMode)(Core::OpenMode::WriteOnly | Core::OpenMode::Truncate));
if (file_or_error.is_error())
return file_or_error.error();
auto bitmap = try_compose_bitmap();
auto bitmap_format = preserve_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888;
auto bitmap = try_compose_bitmap(bitmap_format);
if (!bitmap)
return String { "Failed to allocate bitmap for encoding"sv };
@ -222,13 +223,14 @@ Result<void, String> Image::export_bmp_to_file(String const& file_path)
return {};
}
Result<void, String> Image::export_png_to_file(String const& file_path)
Result<void, String> Image::export_png_to_file(String const& file_path, bool preserve_alpha_channel)
{
auto file_or_error = Core::File::open(file_path, (Core::OpenMode)(Core::OpenMode::WriteOnly | Core::OpenMode::Truncate));
if (file_or_error.is_error())
return file_or_error.error();
auto bitmap = try_compose_bitmap();
auto bitmap_format = preserve_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888;
auto bitmap = try_compose_bitmap(bitmap_format);
if (!bitmap)
return String { "Failed to allocate bitmap for encoding"sv };

View file

@ -43,7 +43,7 @@ public:
static RefPtr<Image> try_create_from_bitmap(NonnullRefPtr<Gfx::Bitmap>);
// This generates a new Bitmap with the final image (all layers composed according to their attributes.)
RefPtr<Gfx::Bitmap> try_compose_bitmap() const;
RefPtr<Gfx::Bitmap> try_compose_bitmap(Gfx::BitmapFormat format) const;
size_t layer_count() const { return m_layers.size(); }
Layer const& layer(size_t index) const { return m_layers.at(index); }
@ -58,8 +58,8 @@ public:
void paint_into(GUI::Painter&, Gfx::IntRect const& dest_rect) const;
Result<void, String> write_to_file(String const& file_path) const;
Result<void, String> export_bmp_to_file(String const& file_path);
Result<void, String> export_png_to_file(String const& file_path);
Result<void, String> export_bmp_to_file(String const& file_path, bool preserve_alpha_channel);
Result<void, String> export_png_to_file(String const& file_path, bool preserve_alpha_channel);
void move_layer_to_front(Layer&);
void move_layer_to_back(Layer&);

View file

@ -157,7 +157,8 @@ int main(int argc, char** argv)
auto save_path = GUI::FilePicker::get_save_filepath(window, "untitled", "bmp");
if (!save_path.has_value())
return;
auto result = editor->image().export_bmp_to_file(save_path.value());
auto preserve_alpha_channel = GUI::MessageBox::show(window, "Do you wish to preserve transparency?", "Preserve transparency?", GUI::MessageBox::Type::Question, GUI::MessageBox::InputType::YesNo);
auto result = editor->image().export_bmp_to_file(save_path.value(), preserve_alpha_channel == GUI::MessageBox::ExecYes);
if (result.is_error())
GUI::MessageBox::show_error(window, String::formatted("Export to BMP failed: {}", result.error()));
},
@ -169,7 +170,8 @@ int main(int argc, char** argv)
auto save_path = GUI::FilePicker::get_save_filepath(window, "untitled", "png");
if (!save_path.has_value())
return;
auto result = editor->image().export_bmp_to_file(save_path.value());
auto preserve_alpha_channel = GUI::MessageBox::show(window, "Do you wish to preserve transparency?", "Preserve transparency?", GUI::MessageBox::Type::Question, GUI::MessageBox::InputType::YesNo);
auto result = editor->image().export_png_to_file(save_path.value(), preserve_alpha_channel == GUI::MessageBox::ExecYes);
if (result.is_error())
GUI::MessageBox::show_error(window, String::formatted("Export to PNG failed: {}", result.error()));
},