diff --git a/Base/usr/share/man/man1/image2bin.md b/Base/usr/share/man/man1/image2bin.md new file mode 100644 index 00000000000..52623f24aad --- /dev/null +++ b/Base/usr/share/man/man1/image2bin.md @@ -0,0 +1,23 @@ +## Name + +image2bin - convert an image to a binary bitmap + +## Synopsis + +```**sh +$ image2bin +``` + +## Description + +`image2bin` uses LibGfx to decode a specified image to a raw bitmap, so it could be stored +in a raw binary format for further examination. + +## Examples + +```sh +# Convert a PNG image to raw bitmap +$ image2bin example.png > example.bin +# Convert a JPG image to raw bitmap +$ image2bin another_example.jpg > another_example.bin +``` diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index f85f84a7c60..fc131dc1d29 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -91,6 +91,7 @@ target_link_libraries(gunzip PRIVATE LibCompress) target_link_libraries(gzip PRIVATE LibCompress) target_link_libraries(headless-browser PRIVATE LibCrypto LibGemini LibGfx LibHTTP LibTLS LibWeb LibWebSocket LibIPC LibJS) target_link_libraries(icc PRIVATE LibGfx) +target_link_libraries(image2bin PRIVATE LibGfx) target_link_libraries(jail-attach PRIVATE LibCore LibMain) target_link_libraries(jail-create PRIVATE LibCore LibMain) target_link_libraries(js PRIVATE LibCrypto LibJS LibLine LibLocale LibTextCodec) diff --git a/Userland/Utilities/image2bin.cpp b/Userland/Utilities/image2bin.cpp new file mode 100644 index 00000000000..bdfa3d68bd8 --- /dev/null +++ b/Userland/Utilities/image2bin.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2023, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ErrorOr serenity_main(Main::Arguments arguments) +{ + TRY(Core::System::pledge("stdio rpath unix")); + DeprecatedString path; + + Core::ArgsParser args_parser; + args_parser.add_positional_argument(path, "Path to image", "path"); + args_parser.parse(arguments); + + auto bitmap = TRY(Gfx::Bitmap::try_load_from_file(path)); + + TRY(Core::System::pledge("stdio")); + Vector data; + for (auto height = 0; height < bitmap->size().height(); height++) { + auto* scanline = bitmap->scanline_u8(height); + for (auto byte_index_in_row = 0u; byte_index_in_row < bitmap->pitch(); byte_index_in_row++) { + TRY(data.try_append(scanline[byte_index_in_row])); + } + } + VERIFY(data.size() == bitmap->size_in_bytes()); + TRY(Core::System::write(STDOUT_FILENO, data.span())); + return 0; +}