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:
parent
8324ffefe7
commit
2183d01eb0
Notes:
sideshowbarker
2024-07-18 10:25:27 +09:00
Author: https://github.com/metmo Commit: https://github.com/SerenityOS/serenity/commit/2183d01eb0c Pull-request: https://github.com/SerenityOS/serenity/pull/8440
3 changed files with 15 additions and 11 deletions
|
@ -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 };
|
||||
|
||||
|
|
|
@ -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&);
|
||||
|
|
|
@ -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()));
|
||||
},
|
||||
|
|
Loading…
Add table
Reference in a new issue