diff options
| author | rimio <vasi.vilvoiu@gmail.com> | 2019-01-10 01:29:40 +0200 |
|---|---|---|
| committer | rimio <vasi.vilvoiu@gmail.com> | 2019-01-10 01:29:40 +0200 |
| commit | de931b95f6dc358b20fdfdf493013fcd673ac70a (patch) | |
| tree | 0b801f83be3281cd77da62892de3b95b61587262 /src/tools/sstv-encode.cpp | |
| parent | 41f3b5f445a98500a345b00bc4a3ce111af652e8 (diff) | |
PD120 somewhat working
Diffstat (limited to 'src/tools/sstv-encode.cpp')
| -rw-r--r-- | src/tools/sstv-encode.cpp | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/src/tools/sstv-encode.cpp b/src/tools/sstv-encode.cpp index 3919968..51b5a33 100644 --- a/src/tools/sstv-encode.cpp +++ b/src/tools/sstv-encode.cpp @@ -7,11 +7,11 @@ #include <iostream> #include <malloc.h> -#include <sndfile.h> #include <glog/logging.h> #include <gflags/gflags.h> -#include "cimg/CImg.h" +#include <Magick++.h> +#include <sndfile.h> extern "C" { #include <libsstv.h> @@ -50,12 +50,62 @@ int main(int argc, char **argv) /* TODO: parse SSTV mode */ sstv_mode_t mode = SSTV_MODE_PD120; - /* load image from file (TODO: perform normalization from source to desired properties) */ + /* get image properties for chosen mode */ + size_t width, height; + sstv_image_format_t format; + if (sstv_get_mode_image_props(mode, &width, &height, &format) != SSTV_OK) { + LOG(FATAL) << "sstv_get_mode_image_props() failed"; + } + + /* load image from file */ LOG(INFO) << "Loading image from " << FLAGS_input; - cimg_library::CImg<unsigned char> input_image = (cimg_library::CImg<>(FLAGS_input.c_str())).RGBtoYCbCr(); + + Magick::Image image; + std::string map = ""; + uint8_t *image_buffer = NULL; + + try { + /* load from file */ + image.read(FLAGS_input); + + /* resize */ + LOG(INFO) << "Resizing to " << width << "x"<<height; + Magick::Geometry nsize(width, height); + nsize.aspect(true); + image.scale(nsize); + + /* format */ + //format = SSTV_FORMAT_Y; + switch (format) { + case SSTV_FORMAT_Y: + map = "R"; + image.magick("Y"); + break; + + case SSTV_FORMAT_YCBCR: + map = "RGB"; + image.colorSpace(Magick::YCbCrColorspace); + break; + + case SSTV_FORMAT_RGB: + map = "RGB"; + image.colorSpace(Magick::RGBColorspace); + break; + + default: + LOG(FATAL) << "Unknown pixel format"; + break; + } + } catch (int e) { + LOG(FATAL) << "Magick++ failed"; + } + + /* get raw */ + Magick::PixelData blob(image, map, Magick::CharPixel); + image_buffer = (uint8_t *)blob.data(); sstv_image_t sstv_image; - if (sstv_pack_image(&sstv_image, input_image.width(), input_image.height(), SSTV_FORMAT_YCBCR, input_image.data()) != SSTV_OK) { + if (sstv_pack_image(&sstv_image, width, height, format, image_buffer) != SSTV_OK) { LOG(FATAL) << "sstv_pack_image() failed"; } |
