From b0758dcc73ecb8752ee51722b87bf8cd82b9b8c0 Mon Sep 17 00:00:00 2001 From: Joshua Jerred Date: Sun, 12 Mar 2023 20:23:47 -0600 Subject: [PATCH] Initial Commit --- .gitignore | 2 + .timetracker | 1 + CMakeLists.txt | 25 +++++ README.md | 33 ++++++ example/converted_test1.png | Bin 0 -> 24937 bytes example/converted_test2.png | Bin 0 -> 25244 bytes example/converted_test3.jpg | Bin 0 -> 6363 bytes example/example.cpp | 27 +++++ example/test1.png | Bin 0 -> 19049 bytes example/test2.png | Bin 0 -> 17148 bytes example/test3.jpg | Bin 0 -> 25143 bytes src/sstv-image-tools.cpp | 195 ++++++++++++++++++++++++++++++++++++ src/sstv-image-tools.h | 92 +++++++++++++++++ 13 files changed, 375 insertions(+) create mode 100644 .gitignore create mode 100644 .timetracker create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 example/converted_test1.png create mode 100644 example/converted_test2.png create mode 100644 example/converted_test3.jpg create mode 100644 example/example.cpp create mode 100644 example/test1.png create mode 100644 example/test2.png create mode 100644 example/test3.jpg create mode 100644 src/sstv-image-tools.cpp create mode 100644 src/sstv-image-tools.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1899660 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +.vscode \ No newline at end of file diff --git a/.timetracker b/.timetracker new file mode 100644 index 0000000..5713386 --- /dev/null +++ b/.timetracker @@ -0,0 +1 @@ +{"total":15240,"sessions":[{"begin":"2023-03-12T13:44:37-06:00","end":"2023-03-12T13:48:55-06:00","duration":258},{"begin":"2023-03-12T13:49:38-06:00","end":"2023-03-12T13:55:19-06:00","duration":341},{"begin":"2023-03-12T13:55:28-06:00","end":"2023-03-12T14:12:39-06:00","duration":1030},{"begin":"2023-03-12T14:12:42-06:00","end":"2023-03-12T14:53:07-06:00","duration":2424},{"begin":"2023-03-12T14:56:47-06:00","end":"2023-03-12T15:03:52-06:00","duration":425},{"begin":"2023-03-12T15:05:24-06:00","end":"2023-03-12T15:32:37-06:00","duration":1632},{"begin":"2023-03-12T15:32:42-06:00","end":"2023-03-12T15:48:18-06:00","duration":936},{"begin":"2023-03-12T15:49:19-06:00","end":"2023-03-12T15:59:42-06:00","duration":623},{"begin":"2023-03-12T16:00:06-06:00","end":"2023-03-12T16:07:04-06:00","duration":417},{"begin":"2023-03-12T16:07:33-06:00","end":"2023-03-12T16:13:28-06:00","duration":354},{"begin":"2023-03-12T16:17:33-06:00","end":"2023-03-12T16:36:24-06:00","duration":1131},{"begin":"2023-03-12T16:38:20-06:00","end":"2023-03-12T17:24:24-06:00","duration":2764},{"begin":"2023-03-12T17:25:18-06:00","end":"2023-03-12T17:27:19-06:00","duration":121},{"begin":"2023-03-12T18:08:42-06:00","end":"2023-03-12T18:08:57-06:00","duration":15},{"begin":"2023-03-12T18:09:00-06:00","end":"2023-03-12T18:11:02-06:00","duration":122},{"begin":"2023-03-12T19:14:25-06:00","end":"2023-03-12T19:17:15-06:00","duration":170},{"begin":"2023-03-12T19:18:33-06:00","end":"2023-03-12T19:20:50-06:00","duration":137},{"begin":"2023-03-12T19:21:10-06:00","end":"2023-03-12T19:24:03-06:00","duration":173},{"begin":"2023-03-12T19:25:08-06:00","end":"2023-03-12T19:33:11-06:00","duration":483},{"begin":"2023-03-12T19:35:37-06:00","end":"2023-03-12T19:37:53-06:00","duration":135},{"begin":"2023-03-12T19:39:51-06:00","end":"2023-03-12T19:41:53-06:00","duration":122},{"begin":"2023-03-12T19:48:10-06:00","end":"2023-03-12T20:11:58-06:00","duration":1427}]} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..55af566 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.14) +project(SSTV-Image-Tools VERSION 0.4) +set(CMAKE_CXX_STANDARD 20) + +set(CMAKE_BUILD_TYPE Debug) # Change to Release for production +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ + -fno-omit-frame-pointer \ + -pedantic \ + -Wall \ + -Wextra \ + -Weffc++ \ + -Wdisabled-optimization \ + -Wno-unused-variable") + +include_directories(src) + +add_executable(example + example/example.cpp + src/sstv-image-tools.cpp +) +add_definitions(-DMAGICKCORE_QUANTUM_DEPTH=8) +add_definitions(-DMAGICKCORE_HDRI_ENABLE=1) # Required or there are linking errors with Magick::Color::Color +find_package(ImageMagick COMPONENTS Magick++) +include_directories(${ImageMagick_INCLUDE_DIRS}) +target_link_libraries(example ${ImageMagick_LIBRARIES}) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a2b305b --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# SSTV Image Tools C++ Library + +Currently in development but it's functional. Will be used with the MWAV library to create SSTV images. + +A simple library for manipulating images into common SSTV image formats using Magick++. + +Basic Features: +- Overlay call sign and ~~message text~~ +- Convert the image to the proper color space +- Get the values for individual pixels +- ~~Add Data to the image~~ + +*** + +Supported SSTV Image Formats: +- Robot24 +- Robot36 +- Robot72 +- ~~Robot8 B/W~~ +- ~~Robot16 B/W~~ + +Tested with jpeg, and png images, support for other Magick++ supported formats has not been tested. + +Magick++ (7.1) with ``libjpeg62-dev``, ``libpng-dev``, ``libfreetype6-dev`` is required. + +*** + +Example Image Sources: +|Image File|Source|License| +|:--------:|:----:|:-----:| +|`example/test1.png`|[Wikipedia](https://en.wikipedia.org/wiki/File:Philips_PM5544.svg)|GNU 1.2| +|`example/test2.png`|[Wikipedia](https://en.wikipedia.org/wiki/File:TwibrightLinksTestCard.png)|GNU 1.2| +|`example/test3.jpg`|[Wikipedia](https://en.wikipedia.org/wiki/File:SMPTE_Color_Bars.svg)|Public Domain| diff --git a/example/converted_test1.png b/example/converted_test1.png new file mode 100644 index 0000000000000000000000000000000000000000..8527cd9fafe5a2d20277de1653b9e8e9504e0b2f GIT binary patch literal 24937 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 literal 0 HcmV?d00001 diff --git a/example/example.cpp b/example/example.cpp new file mode 100644 index 0000000..c93ab49 --- /dev/null +++ b/example/example.cpp @@ -0,0 +1,27 @@ +#include +#include +#include + +#include "sstv-image-tools.h" + +int main() { + std::array test_images = {"test1.png", "test2.png", + "test3.jpg"}; + + for (auto &image_path : test_images) { + SstvImage image(SstvImage::Mode::ROBOT_36_COLOR, image_path, + "converted_" + image_path); + image.AddCallSign("N0CALL"); + + SstvImage::Pixel pixel; + if (!image.GetPixel(128, 91, pixel)) { + std::cout << "Failed to get pixel" << std::endl; + } + + std::cout << (int)pixel.r << " " << (int)pixel.g << " " << (int)pixel.b + << std::endl; + + image.Write(); + } + return 0; +} \ No newline at end of file diff --git a/example/test1.png b/example/test1.png new file mode 100644 index 0000000000000000000000000000000000000000..45e137b87dab82da0b2c7286470b0a5345c3c33a GIT binary patch literal 19049 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 BE+PN` literal 0 HcmV?d00001 diff --git a/example/test2.png b/example/test2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8fd336b645af7d6efc587846733670169589b5 GIT binary patch literal 17148 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 literal 0 HcmV?d00001 diff --git a/example/test3.jpg b/example/test3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb269d912d29ad2775e199d7f619cc3a14a833f9 GIT binary patch literal 25143 zcmeI33s6&M7J&b}2nkpOf>Me^9+l9#b_MDSAwC*WW~v6*sq2q5zUzbH_01Z0 zif-d-+qIDZ3nG?Uq*d!0Me()kcBoJlodsNwhYB&0KpxzG|C`G0H8XYYpU&*gI)9k| zav$g9o^$Rw-#!0@3va?^Ff?VxtQmmE1AvEq0K5&R18*-cv6skOEEY>7-cn!L5MLi3 z-xmV{{bVCT0soP8#Zp+zGG+p?{;bb@Ud>+ANL>lu*k+JXLf4LhZ#% zm#xY!YHYdt&(^kk?H!$6kIavIE!Mt%o1O8C2LwO5g_b`$=H{0_@{2DN z3WQ?DFCKp#8UlZzD159}z*Mz(@yfu6*e%|&X?qKgos&eyrJ914tg4d^i;8b~`4Quq z%QJ3{ZS}~re>?UczZ!wBfQK%gz#k|mcYL=pg7I=qIj3 z6s{v|w@Nnej=q?yJR=vj7U`Uqf3^eXJT|0rYE!CAtpZ%f`Vlg9roa75wMqs!4xXhN z!zjiX`73Hwko|BCSECrYbc6O)bI}QfK?}H!-VBA|OzXf%uJVlB<8q`E?7V}c(|1*2 z_{(+k9)nf^I1a(t4ujTI(6ANb^<=-JWf;yg4%kxB3(XC)hjKKEF`i!{Q)~8(IH!`$ z<#8NhL!Bz9FS?VfJR>JQh%&%*>0S%RbGUTQAf0Z#4yy#js06les=&##y!SDTav642 zhZs=40>`i*bbT;i8&4dDuI5SQOew}Y{gb&X1$&Z$Y5zp>JneR2%XaG#gFV z^p8 zEo^F>UwIE@M%aGqnK)NcBe}ZGjLRov%|r%(|mI{z&s(|7+%P5U?yNVp)2@P_Qhi zWuR0`Q|G9?ng>k}Xb;OX)GTEQO#x5`s~bBSgvGXwE)LSIslFZcyG_?`P}lH$G12>0dxuyitwl z>5B!d^%Efq`?X96_E3wPmF-P;A^6)fzqsiB>$&vQf&9%7=&9Wh#GQd)$9@Rr7C1kF z;6e6NTg$c>3Mv|UY+`GefX<^|bN<~y57P`xQ<@Rrjuo-izwpu~F&4{-!9Op;mrplY zsf@|Y;v?-@%P!a2lTGmPH3+gSMXqI8$05m62dms}?!td0J2WL>%;HTInBGcN+tth> zy?(AR=_e0~OChM~MtIGIAewS4l$*XacA@;b(nR0LoTUOAo19~M?E8)8br4jeo0QMD zbV-l%AiATiZPm>cA0^uOQ4=+yNnO$AK``L{c6^SSXju$ob{x36rS3I8jRU9 zpC#+J6FF$#_9gB`9h5IblZwCoX|Y>vGgCn>LzLqdywPsK)Z%GfPkgYg7MhGZ9_ z@H9?fyNt8$ce2BveKgx-;Ql;=oqU3pa`X)4&;y(c%9d52X}-BV7<1ObWR)wkGTega z6YmzhcijBqAH`$`#J$H0WXUkq~qoOzYye6!?XX$O2F$5TlV&I4_-OE^)Cj`K_37B literal 0 HcmV?d00001 diff --git a/src/sstv-image-tools.cpp b/src/sstv-image-tools.cpp new file mode 100644 index 0000000..d8526c3 --- /dev/null +++ b/src/sstv-image-tools.cpp @@ -0,0 +1,195 @@ +#include "sstv-image-tools.h" + +#include +#include +#include + +SstvImage::Color::Color(int red, int green, int blue) { + this->r = red; + this->g = green; + this->b = blue; +} + +SstvImage::SstvImage(SstvImage::Mode mode, std::string source_image_path, + std::string destination_image_path, bool crop) + : mode_(mode), crop_(crop) { + source_path_ = source_image_path; + if (destination_image_path == "") { + destination_path_ = source_image_path; + } else { + destination_path_ = destination_image_path; + } + try { + image_.read(source_image_path); + Scale(); + } catch (Magick::Exception &error_) { + throw SstvImageToolsException("Failed to read image: " + source_image_path); + } +} + +void SstvImage::Write() { + try { + image_.write(destination_path_); + } catch (Magick::Exception &error_) { + throw SstvImageToolsException("Failed to write image: " + + destination_path_); + } +} + +void SstvImage::AddCallSign(const std::string &callsign, + const SstvImage::Color &color) { + (void)color; + + int font_size = 20 * height_scaler_; + + Magick::DrawableFont font("Arial-Bold"); + Magick::DrawablePointSize point_size(font_size); + Magick::DrawableText text(0, 0 + font_size, callsign); + Magick::DrawableStrokeColor stroke_color("red"); + Magick::DrawableFillColor fill("green"); + + std::vector draw_list({font, point_size, text, stroke_color, + fill}); + + image_.draw(draw_list); +} + +bool SstvImage::GetPixel(int x, int y, SstvImage::Pixel &pixel) { + if (x < 0 || x >= width_ || y < 0 || y >= height_) { + return false; + } + + MagickCore::Quantum *pixels = image_.getPixels(0, 0, width_, height_); + unsigned index = (y * width_ + x) * image_.channels(); + + pixel.r = pixels[index]; + pixel.g = pixels[index + 1]; + pixel.b = pixels[index + 2]; + return true; +} + +void SstvImage::Scale() { + width_ = 0; + height_ = 0; + int scale_factor = 1; + switch (mode_) { + case SstvImage::Mode::ROBOT_8_BW: + case SstvImage::Mode::ROBOT_12_BW: + case SstvImage::Mode::ROBOT_12_COLOR: + width_ = 160; + height_ = 120; + scale_factor = 1.2; + break; + case SstvImage::Mode::ROBOT_24_BW: + case SstvImage::Mode::ROBOT_36_BW: + case SstvImage::Mode::ROBOT_24_COLOR: + case SstvImage::Mode::ROBOT_36_COLOR: + width_ = 320; + height_ = 240; + scale_factor = 1.0; + break; + case SstvImage::Mode::ROBOT_72_COLOR: + width_ = 640; + height_ = 480; + break; + default: + throw SstvImageToolsException("Not yet implemented"); + } + + height_scaler_ = (height_ / 100.0) * scale_factor; + + Magick::Geometry crop_size(width_, height_); + if (crop_) { + crop_size.fillArea(true); + image_.resize(crop_size); + image_.extent(crop_size, Magick::CenterGravity); + + + } else { + crop_size.aspect(true); + image_.resize(crop_size); + } +} + + + + + + + + + + + + + + + + + + +bool ConvertToRobot8(std::string image_path) { + Magick::Image image; + Magick::Geometry crop_size(160, 120); + crop_size.aspect(true); + try { + image.read(image_path); + image.scale(crop_size); + image.quantizeColorSpace(Magick::GRAYColorspace); + image.quantizeColors(8); + image.quantize(); + image.write(image_path + ".r8.png"); + } catch (Magick::Exception &error_) { + std::cout << "Caught exception: " << error_.what() << std::endl; + return 1; + } + return 0; +} + +bool ConvertToRobot36(std::string image_path) { + Magick::Image image; + Magick::Geometry crop_size(320, 240); + crop_size.aspect(true); + try { + image.read(image_path); + image.scale(crop_size); + image.quantizeColorSpace(Magick::YUVColorspace); + image.quantize(); + image.write(image_path + ".r36.png"); + } catch (Magick::Exception &error_) { + std::cout << "Caught exception: " << error_.what() << std::endl; + return 1; + } + return 0; +} + +bool ConvertToCustom8(std::string image_path) { + Magick::Image image; + try { + image.read(image_path); + Magick::Geometry crop_size(400, 400); + crop_size.aspect(true); + image.scale(crop_size); + image.crop(crop_size); + image.quantizeColorSpace(Magick::GRAYColorspace); + image.quantizeColors(200); + image.quantize(); + image.write(image_path + ".c8.png"); + } catch (Magick::Exception &error_) { + std::cout << "exception: " << error_.what() << std::endl; + return 1; + } + return 0; +} + +bool Pixels(std::string image_path) { + Magick::Image image; + try { + image.read(image_path); + Magick::Pixels view(image); + } catch (Magick::Exception &error_) { + std::cout << "exception: " << error_.what() << std::endl; + return 1; + } + return 0; +} \ No newline at end of file diff --git a/src/sstv-image-tools.h b/src/sstv-image-tools.h new file mode 100644 index 0000000..990b5f6 --- /dev/null +++ b/src/sstv-image-tools.h @@ -0,0 +1,92 @@ +#ifndef IMAGE_TOOLS_H_ +#define IMAGE_TOOLS_H_ + +#include + +#include +#include +#include + +class SstvImage { + public: + enum class Mode { + ROBOT_8_BW, // 160x120 (4:3) Black and White + ROBOT_12_BW, // 160x120 (4:3) Black and White + ROBOT_24_BW, // 320x240 (4:3) Black and White + ROBOT_36_BW, // 320x240 (4:3) Black and White + ROBOT_12_COLOR, // 160x120 (4:3) Color + ROBOT_24_COLOR, // 320x240 (4:3) Color + ROBOT_36_COLOR, // 320x240 (4:3) Color + ROBOT_72_COLOR, // 640x480 (4:3) Color + CUSTOM_TEST }; + + struct Color { + int r = -1; + int g = -1; + int b = -1; + float gray_scale_value = -1; + Color(int r, int g, int b); // 0 - 255 + Color(int gray_scale_value); // 0.0 - 1.0 + }; + + struct Pixel { + uint8_t r = -1; + uint8_t g = -1; + uint8_t b = -1; + }; + + /** + * @brief Construct a new SSTV Image Tools object + * + * @param source_image_path The path to the image to be converted + * @param destination_image_path *Optional* If not specified, the source image + * will be overwritten + * @exception SstvImageToolsException If the image cannot be read + */ + SstvImage(SstvImage::Mode mode, std::string source_image_path, + std::string destination_image_path = "", bool crop = true); + ~SstvImage() {} + + void Write(); + + void AddCallSign(const std::string &callsign, + const SstvImage::Color &color = {-2, -2, -2}); + void AddMessage(std::string message); + + bool GetPixel(int x, int y, SstvImage::Pixel &pixel); + int GetWidth() { return width_; } + int GetHeight() { return height_; } + + private: + void Scale(); + + std::pair WorkspaceToImageCoordinates(int x, int y); + + int width_ = 0; + int height_ = 0; + double height_scaler_ = 1; + + std::string source_path_ = ""; + std::string destination_path_ = ""; + Magick::Image image_ = Magick::Image(); + SstvImage::Mode mode_; + bool crop_; +}; + +class SstvImageToolsException : public std::exception { + public: + SstvImageToolsException(std::string message) : message_(message) {} + ~SstvImageToolsException() throw() {} + const char *what() const throw() { return message_.c_str(); } + + private: + std::string message_; +}; + +bool ConvertToRobot8(std::string image_path); +bool ConvertToRobot36(std::string image_path); +bool ConvertToCustom8(std::string image_path); + +bool Pixels(std::string image_path); + +#endif \ No newline at end of file