From 01db302a33d6441e4351089aae7128423a27751d Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 14 Jan 2023 03:30:09 +0200 Subject: [PATCH] Utilities: Add new utility for converting images to raw bitmap binaries I used this utility to check if the possible TGA images' cases for different origins (explictly the Y origin) are generating the same bitmap, as I felt that my eyes are not a good-enough measurement tool for this kind of task. This might be useful in the future for testing other implementations so I rather have this nice utility in our codebase. --- Base/usr/share/man/man1/image2bin.md | 23 ++++++++++++++++ Userland/Utilities/CMakeLists.txt | 1 + Userland/Utilities/image2bin.cpp | 39 ++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 Base/usr/share/man/man1/image2bin.md create mode 100644 Userland/Utilities/image2bin.cpp 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; +}