mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 08:44:58 +00:00
Userland: Add an image
utility
At the moment, all it can do is read all image formats that LibGfx can read and save to any image format that LibGfx can write (currently bmp, png, qoi). Currently, it drops all image metadata (including color profiles). Over time, this could learn tricks like keeping color profiles, converting an image to a different color profile, cropping out a part of an image, and so on.
This commit is contained in:
parent
3cff36b7ab
commit
b10ec6743f
3 changed files with 59 additions and 0 deletions
55
Userland/Utilities/image.cpp
Normal file
55
Userland/Utilities/image.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Nico Weber <thakis@chromium.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibCore/ArgsParser.h>
|
||||
#include <LibCore/File.h>
|
||||
#include <LibCore/MappedFile.h>
|
||||
#include <LibGfx/BMPWriter.h>
|
||||
#include <LibGfx/ImageDecoder.h>
|
||||
#include <LibGfx/PNGWriter.h>
|
||||
#include <LibGfx/QOIWriter.h>
|
||||
|
||||
ErrorOr<int> serenity_main(Main::Arguments arguments)
|
||||
{
|
||||
Core::ArgsParser args_parser;
|
||||
|
||||
StringView in_path;
|
||||
args_parser.add_positional_argument(in_path, "Path to input image file", "FILE");
|
||||
|
||||
StringView out_path;
|
||||
args_parser.add_option(out_path, "Path to output image file", "output", 'o', "FILE");
|
||||
|
||||
args_parser.parse(arguments);
|
||||
|
||||
if (out_path.is_empty()) {
|
||||
warnln("-o is required");
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto file = TRY(Core::MappedFile::map(in_path));
|
||||
auto decoder = Gfx::ImageDecoder::try_create_for_raw_bytes(file->bytes());
|
||||
|
||||
// This uses ImageDecoder instead of Bitmap::load_from_file() to have more control
|
||||
// over selecting a frame, access color profile data, and so on in the future.
|
||||
auto frame = TRY(decoder->frame(0)).image;
|
||||
|
||||
ByteBuffer bytes;
|
||||
if (out_path.ends_with(".bmp"sv, CaseSensitivity::CaseInsensitive)) {
|
||||
bytes = Gfx::BMPWriter().dump(frame);
|
||||
} else if (out_path.ends_with(".png"sv, CaseSensitivity::CaseInsensitive)) {
|
||||
bytes = TRY(Gfx::PNGWriter::encode(*frame));
|
||||
} else if (out_path.ends_with(".qoi"sv, CaseSensitivity::CaseInsensitive)) {
|
||||
bytes = Gfx::QOIWriter::encode(*frame);
|
||||
} else {
|
||||
warnln("can only write .bmp, .png, and .qoi");
|
||||
return 1;
|
||||
}
|
||||
|
||||
auto output_stream = TRY(Core::File::open(out_path, Core::File::OpenMode::Write));
|
||||
TRY(output_stream->write_entire_buffer(bytes));
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue