boat
C++23 geospatial library
Loading...
Searching...
No Matches
gil.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GIL_HPP
4#define BOAT_GIL_HPP
5
6#include <boat/blob.hpp>
7#include <boost/gil/extension/dynamic_image/any_image.hpp>
8#if __has_include(<jpeglib.h>)
9#include <boost/gil/extension/io/jpeg.hpp>
10#else
11#pragma message("no libjpeg")
12#endif
13#if __has_include(<png.h>) && __has_include(<zlib.h>)
14#include <boost/gil/extension/io/png.hpp>
15#else
16#pragma message("no libpng/zlib")
17#endif
18#include <boost/mp11.hpp>
19#include <cstdint>
20
21namespace boat::gil {
22
23template <class Value, class Layout>
24using image = boost::gil::image<boost::gil::pixel<Value, Layout>, false>;
25
26using any_image = boost::mp11::mp_rename< //
27 boost::mp11::mp_product< //
28 image,
29 boost::mp11::mp_list< //
30 uint8_t,
31 int8_t,
32 uint16_t,
33 int16_t,
34 uint32_t,
35 int32_t,
36 uint64_t,
37 int64_t,
38 float,
39 double>,
40 boost::mp11::mp_list< //
41 boost::gil::abgr_layout_t,
42 boost::gil::argb_layout_t,
43 boost::gil::bgr_layout_t,
44 boost::gil::bgra_layout_t,
45 boost::gil::cmyk_layout_t,
46 boost::gil::gray_layout_t,
47 boost::gil::rgb_layout_t,
48 boost::gil::rgba_layout_t>>,
49 boost::gil::any_image>;
50
51using any_image_view = typename any_image::const_view_t;
52
53template <class T>
54 requires requires { boost::gil::view(std::declval<T&>()); }
56{
57 auto ret = T{img.dimensions()};
58 copy_and_convert_pixels(img, view(ret));
59 return ret;
60}
61
63template <class T>
64 requires requires { boost::gil::view(std::declval<T&>()); }
66{
67 auto fit = [](std::initializer_list<int> bytes) {
68 return bytes | std::views::transform([](int i) {
69 return static_cast<std::byte>(i);
70 }) |
71 std::ranges::to<blob>();
72 };
73 auto is = std::istringstream(std::string(as_chars(img.data()), img.size()));
74 auto ret = T{};
75 if (img.starts_with(fit({0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A})))
76#if __has_include(<png.h>) && __has_include(<zlib.h>)
77 read_and_convert_image(is, ret, boost::gil::png_tag());
78#else
79 throw std::runtime_error("compiled without libpng/zlib");
80#endif
81 else if (img.starts_with(fit({0xFF, 0xD8, 0xFF})))
82#if __has_include(<jpeglib.h>)
83 read_and_convert_image(is, ret, boost::gil::jpeg_tag());
84#else
85 throw std::runtime_error("compiled without libjpeg");
86#endif
87 else
88 throw std::runtime_error("unsupported image format");
89 return ret;
90}
91
92} // namespace boat::gil
93
94#endif // BOAT_GIL_HPP
Definition gil.hpp:21
T read(blob_view img)
Decodes PNG or JPEG by signature.
Definition gil.hpp:65
boost::gil::image< boost::gil::pixel< Value, Layout >, false > image
Definition gil.hpp:24
T to(any_image_view img)
Definition gil.hpp:55
boost::mp11::mp_rename< boost::mp11::mp_product< image, boost::mp11::mp_list< uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double >, boost::mp11::mp_list< boost::gil::abgr_layout_t, boost::gil::argb_layout_t, boost::gil::bgr_layout_t, boost::gil::bgra_layout_t, boost::gil::cmyk_layout_t, boost::gil::gray_layout_t, boost::gil::rgb_layout_t, boost::gil::rgba_layout_t > >, boost::gil::any_image > any_image
Definition gil.hpp:26
typename any_image::const_view_t any_image_view
Definition gil.hpp:51
Definition blob.hpp:14