CARLA
 
载入中...
搜索中...
未找到
ImageIOConfig.h
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once // 确保头文件只被包含一次
8
9#include "carla/FileSystem.h" // 引入文件系统相关的头文件
10#include "carla/Logging.h" // 引入日志记录相关的头文件
11#include "carla/StringUtil.h" // 引入字符串工具相关的头文件
12#include "carla/image/BoostGil.h" // 引入Boost.GIL库的图像处理功能
13
14// 检测是否支持PNG格式
15#ifndef LIBCARLA_IMAGE_WITH_PNG_SUPPORT
16# if defined(__has_include) && __has_include("png.h") // 检查是否能找到png.h头文件
17# define LIBCARLA_IMAGE_WITH_PNG_SUPPORT true // 定义为支持
18# else
19# define LIBCARLA_IMAGE_WITH_PNG_SUPPORT false // 定义为不支持
20# endif
21#endif
22
23// 检测是否支持JPEG格式
24#ifndef LIBCARLA_IMAGE_WITH_JPEG_SUPPORT
25# if defined(__has_include) && __has_include("jpeglib.h") // 检查是否能找到jpeglib.h头文件
26# define LIBCARLA_IMAGE_WITH_JPEG_SUPPORT true // 定义为支持
27# else
28# define LIBCARLA_IMAGE_WITH_JPEG_SUPPORT false // 定义为不支持
29# endif
30#endif
31
32// 检测是否支持TIFF格式
33#ifndef LIBCARLA_IMAGE_WITH_TIFF_SUPPORT
34# if defined(__has_include) && __has_include("tiffio.h") // 检查是否能找到tiffio.h头文件
35# define LIBCARLA_IMAGE_WITH_TIFF_SUPPORT true // 定义为支持
36# else
37# define LIBCARLA_IMAGE_WITH_TIFF_SUPPORT false // 定义为不支持
38# endif
39#endif
40
41#if defined(__clang__) // 如果使用的是Clang编译器
42# pragma clang diagnostic push // 保存当前的诊断状态
43# pragma clang diagnostic ignored "-Wunused-parameter" // 忽略未使用的参数警告
44#endif
45
46#if LIBCARLA_IMAGE_WITH_PNG_SUPPORT == true // 如果支持PNG格式
47# ifndef png_infopp_NULL
48# define png_infopp_NULL (png_infopp)NULL // 定义PNG信息指针为NULL
49# endif // png_infopp_NULL
50# ifndef int_p_NULL
51# define int_p_NULL (int*)NULL // 定义整数指针为NULL
52# endif // int_p_NULL
53# if defined(__clang__) // 如果使用的是Clang编译器
54# pragma clang diagnostic push // 保存当前的诊断状态
55# pragma clang diagnostic ignored "-Wignored-qualifiers" // 忽略类型限定符被忽略的警告
56# pragma clang diagnostic ignored "-Wparentheses" // 忽略括号相关的警告
57# endif
58# include <boost/gil/extension/io/png.hpp> // 引入Boost.GIL的PNG输入输出扩展
59# if defined(__clang__) // 如果使用的是Clang编译器
60# pragma clang diagnostic pop // 恢复之前的诊断状态
61# endif
62#endif
63
64#if LIBCARLA_IMAGE_WITH_JPEG_SUPPORT == true // 如果支持JPEG格式
65# include <boost/gil/extension/io/jpeg.hpp> // 引入Boost.GIL的JPEG输入输出扩展
66#endif
67
68#if LIBCARLA_IMAGE_WITH_TIFF_SUPPORT == true // 如果支持TIFF格式
69# include <boost/gil/extension/io/tiff.hpp> // 引入Boost.GIL的TIFF输入输出扩展
70#endif
71
72#if defined(__clang__) // 如果使用的是Clang编译器
73# pragma clang diagnostic pop // 恢复之前的诊断状态
74#endif
75
76namespace carla { // 定义命名空间carla
77namespace image { // 定义命名空间image
78namespace io { // 定义命名空间io
79
80 constexpr bool has_png_support() { // 检查是否支持PNG格式
81 return LIBCARLA_IMAGE_WITH_PNG_SUPPORT; // 返回支持状态
82 }
83
84 constexpr bool has_jpeg_support() { // 检查是否支持JPEG格式
85 return LIBCARLA_IMAGE_WITH_JPEG_SUPPORT; // 返回支持状态
86 }
87
88 constexpr bool has_tiff_support() { // 检查是否支持TIFF格式
89 return LIBCARLA_IMAGE_WITH_TIFF_SUPPORT; // 返回支持状态
90 }
91
92 static_assert(has_png_support() || has_jpeg_support() || has_tiff_support(),
93 "No image format supported, please compile with at least one of "
94 "LIBCARLA_IMAGE_WITH_PNG_SUPPORT, LIBCARLA_IMAGE_WITH_JPEG_SUPPORT, "
95 "or LIBCARLA_IMAGE_WITH_TIFF_SUPPORT"); // 检查至少支持一种图像格式
96
97namespace detail { // 定义命名空间detail
98
99 template <typename ViewT, typename IOTag> // 模板结构体,接受视图类型和输入输出标签
100 struct is_write_supported { // 定义写入支持结构体
101 static constexpr bool value = boost::gil::is_write_supported<typename boost::gil::get_pixel_type<ViewT>::type, IOTag>::value; // 判断写入是否支持
102 };
103
104 struct io_png { // 定义PNG输入输出结构体
105#if LIBCARLA_IMAGE_WITH_PNG_SUPPORT // 如果支持PNG格式
106
107 static constexpr const char *get_default_extension() { // 获取默认扩展名
108 return "png"; // 返回“png”作为默认扩展名
109 }
110
111 template <typename Str>
112 static bool match_extension(const Str &str) { // 匹配文件扩展名
113 return StringUtil::EndsWith(str, get_default_extension()); // 判断字符串是否以默认扩展名结尾
114 }
115
116 template <typename Str, typename ImageT>
117 static void read_image(Str &&in_filename, ImageT &image) { // 读取图像
118 boost::gil::read_and_convert_image(std::forward<Str>(in_filename), image, boost::gil::png_tag()); // 使用boost库读取并转换PNG图像
119 }
120
121 template <typename Str, typename ViewT>
122 static void write_view(Str &&out_filename, const ViewT &view) { // 写入视图到文件
123 boost::gil::write_view(std::forward<Str>(out_filename), view, boost::gil::png_tag()); // 使用boost库写入PNG视图
124 }
125
126#endif // LIBCARLA_IMAGE_WITH_PNG_SUPPORT // 结束PNG支持条件编译
127
128 };
129
130 struct io_jpeg { // JPEG输入输出结构体
131
132 static constexpr bool is_supported = has_jpeg_support(); // 检查是否支持JPEG格式
133
134#if LIBCARLA_IMAGE_WITH_JPEG_SUPPORT // 如果支持JPEG格式
135
136 static constexpr const char *get_default_extension() { // 获取默认扩展名
137 return "jpeg"; // 返回“jpeg”作为默认扩展名
138 }
139
140 template <typename Str>
141 static bool match_extension(const Str &str) { // 匹配文件扩展名
142 return StringUtil::EndsWith(str, get_default_extension()) || // 判断字符串是否以默认扩展名结尾
143 StringUtil::EndsWith(str, "jpg"); // 判断字符串是否以“jpg”结尾
144 }
145
146 template <typename Str, typename ImageT>
147 static void read_image(Str &&in_filename, ImageT &image) { // 读取图像
148 boost::gil::read_image(std::forward<Str>(in_filename), image, boost::gil::jpeg_tag()); // 使用boost库读取JPEG图像
149 }
150
151 template <typename Str, typename ViewT>
152 static typename std::enable_if<is_write_supported<ViewT, boost::gil::jpeg_tag>::value>::type
153 write_view(Str &&out_filename, const ViewT &view) { // 写入视图到文件(支持的情况)
154 boost::gil::write_view(std::forward<Str>(out_filename), view, boost::gil::jpeg_tag()); // 使用boost库写入JPEG视图
155 }
156
157 template <typename Str, typename ViewT>
158 static typename std::enable_if<!is_write_supported<ViewT, boost::gil::jpeg_tag>::value>::type
159 write_view(Str &&out_filename, const ViewT &view) { // 写入视图到文件(不支持的情况)
160 boost::gil::write_view(
161 std::forward<Str>(out_filename),
162 boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(view), // 将视图转换为RGB8像素格式
163 boost::gil::jpeg_tag()); // 使用boost库写入JPEG视图
164 }
165#endif // LIBCARLA_IMAGE_WITH_JPEG_SUPPORT // 结束JPEG支持的条件编译
166
167struct io_tiff { // 定义一个io_tiff结构体
168
169 static constexpr bool is_supported = has_tiff_support(); // 判断是否支持TIFF格式
170
171#if LIBCARLA_IMAGE_WITH_TIFF_SUPPORT // 如果开启了TIFF支持
172
173 static constexpr const char *get_default_extension() { // 获取默认扩展名
174 return "tiff"; // 返回TIFF
175 }
176
177 template <typename Str> // 模板函数,接受任何字符串类型
178 static bool match_extension(const Str &str) { // 检查文件扩展名是否匹配
179 return StringUtil::EndsWith(str, get_default_extension()); // 返回是否以默认扩展名结尾
180 }
181
182 template <typename Str, typename ImageT> // 模板函数,接受字符串和图像类型
183 static void read_image(Str &&in_filename, ImageT &image) { // 读取图像
184 boost::gil::read_and_convert_image(std::forward<Str>(in_filename), image, boost::gil::tiff_tag()); // 使用boost库读取并转换图像
185 }
186
187 template <typename Str, typename ViewT> // 模板函数,接受字符串和视图类型
188 static typename std::enable_if<is_write_supported<ViewT, boost::gil::tiff_tag>::value>::type // 如果支持写入
189 write_view(Str &&out_filename, const ViewT &view) { // 写入视图
190 boost::gil::write_view(std::forward<Str>(out_filename), view, boost::gil::tiff_tag()); // 使用boost库写入视图
191 }
192
193 template <typename Str, typename ViewT> // 模板函数,接受字符串和视图类型
194 static typename std::enable_if<!is_write_supported<ViewT, boost::gil::tiff_tag>::value>::type // 如果不支持写入
195 write_view(Str &&out_filename, const ViewT &view) { // 写入视图
196 boost::gil::write_view( // 使用boost库写入
197 std::forward<Str>(out_filename), // 转发输出文件名
198 boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(view), // 先进行颜色转换
199 boost::gil::tiff_tag()); // 使用TIFF标签
200 }
201
202#endif // LIBCARLA_IMAGE_WITH_TIFF_SUPPORT // 结束TIFF支持的条件编译
203};
204
205struct io_resolver { // 定义一个io_resolver结构体
206
207 template <typename IO, typename Str> // 模板函数,接受IO类型和字符串类型
208 static typename std::enable_if<IO::is_supported, bool>::type match_extension(const Str &str) { // 如果IO支持
209 return IO::match_extension(str); // 调用IO的匹配扩展名函数
210 }
211
212 template <typename IO, typename Str> // 模板函数,接受IO类型和字符串类型
213 static typename std::enable_if<!IO::is_supported, bool>::type match_extension(const Str &) { // 如果IO不支持
214 return false; // 返回false
215 }
216
217 template <typename IO, typename Str, typename... Args> // 模板函数,接受IO类型、字符串和其他参数
218 static typename std::enable_if<IO::is_supported>::type read_image(const Str &path, Args &&... args) { // 如果IO支持读取
219 log_debug("reading", path, "as", IO::get_default_extension()); // 日志记录正在读取的文件
220 IO::read_image(path, std::forward<Args>(args)...); // 调用IO的读取图像函数
221 }
222
223 template <typename IO, typename... Args> // 模板函数,接受IO类型和其他参数
224 static typename std::enable_if<!IO::is_supported>::type read_image(Args &&...) { // 如果IO不支持读取
225 DEBUG_ASSERT(false); // 断言失败
226 }
227
228 template <typename IO, typename... Args> // 模板函数,接受IO类型和其他参数
229 static typename std::enable_if<IO::is_supported>::type write_view(std::string &path, Args &&... args) { // 如果IO支持写入
230 FileSystem::ValidateFilePath(path, IO::get_default_extension()); // 验证文件路径
231 log_debug("writing", path, "as", IO::get_default_extension()); // 日志记录正在写入的文件
232 IO::write_view(path, std::forward<Args>(args)...); // 调用IO的写入视图函数
233 }
234
235 template <typename IO, typename... Args> // 模板函数,接受IO类型和其他参数
236 static typename std::enable_if<!IO::is_supported>::type write_view(Args &&...) { // 如果IO不支持写入
237 DEBUG_ASSERT(false); // 断言失败
238 }
239};
240
241template <typename... IOs> // 模板结构体,接受多个IO类型
242struct io_impl; // 前向声明
243
244template <typename IO> // 模板结构体,接受单个IO类型
245struct io_impl<IO> { // 实现io_impl
246 constexpr static bool is_supported = IO::is_supported; // 是否支持IO
247
248 template <typename... Args> // 模板函数,接受任意参数
249 static void read_image(Args &&... args) { // 读取图像
250 io_resolver::read_image<IO>(std::forward<Args>(args)...); // 调用io_resolver的读取函数
251 }
252
253 template <typename... Args> // 模板函数,接受任意参数
254 static void write_view(Args &&... args) { // 写入视图
255 io_resolver::write_view<IO>(std::forward<Args>(args)...); // 调用io_resolver的写入函数
256 }
257
258 template <typename Str, typename... Args> // 模板函数,接受字符串和任意参数
259 static bool try_read_image(const Str &filename, Args &&... args) { // 尝试读取图像
260 if (io_resolver::match_extension<IO>(filename)) { // 如果扩展名匹配
261 io_resolver::read_image<IO>(filename, std::forward<Args>(args)...); // 读取图像
262 return true; // 返回true
263 }
264 return false; // 返回false
265 }
266
267 template <typename Str, typename... Args> // 模板函数,接受字符串和任意参数
268 static bool try_write_view(Str &filename, Args &&... args) { // 尝试写入视图
269 if (io_resolver::match_extension<IO>(filename)) { // 如果扩展名匹配
270 io_resolver::write_view<IO>(filename, std::forward<Args>(args)...); // 写入视图
271 return true; // 返回true
272 }
273 return false; // 返回false
274 }
275};
276 template <typename IO, typename... IOs> // 定义一个模板结构体io_impl,接受一个IO类型和多个IO类型
277struct io_impl<IO, IOs...> { // 特化io_impl
278private:
279 using self = io_impl<IO>; // 定义self为当前IO的io_impl
280 using recursive = io_impl<IOs...>; // 定义recursive为剩余IOs的io_impl
281public:
282
283 constexpr static bool is_supported = self::is_supported || recursive::is_supported; // 判断是否支持任一IO
284
285 template <typename... Args> // 定义一个接受任意参数的模板函数
286 static void read_image(Args &... args) { // 读取图像函数
287 if (!recursive::try_read_image(args...)) { // 如果递归IO未能读取图像
288 self::read_image(args...); // 则调用当前IO读取图像
289 }
290 }
291
292 template <typename... Args> // 定义一个接受任意参数的模板函数
293 static bool try_read_image(Args &... args) { // 尝试读取图像函数
294 return recursive::try_read_image(args...) || self::try_read_image(args...); // 返回递归IO或当前IO是否能读取图像
295 }
296
297 template <typename... Args> // 定义一个接受任意参数的模板函数
298 static void write_view(Args &... args) { // 写入视图函数
299 if (!recursive::try_write_view(args...)) { // 如果递归IO未能写入视图
300 self::write_view(args...); // 则调用当前IO写入视图
301 }
302 }
303
304 template <typename... Args> // 定义一个接受任意参数的模板函数
305 static bool try_write_view(Args &... args) { // 尝试写入视图函数
306 return recursive::try_write_view(args...) || self::try_write_view(args...); // 返回递归IO或当前IO是否能写入视图
307 }
308};
309
310template <typename DefaultIO, typename... IOs> // 定义一个模板结构体io_any,接受默认IO和多个IO
311struct io_any : detail::io_impl<DefaultIO, IOs...> { // 继承自detail::io_impl
312 static_assert(DefaultIO::is_supported, "Default IO needs to be supported."); // 确保默认IO是支持的
313};
314
315} // namespace detail
316
317struct png : detail::io_impl<detail::io_png> {}; // 定义png结构体,继承自io_impl
318
319struct jpeg : detail::io_impl<detail::io_jpeg> {}; // 定义jpeg结构体,继承自io_impl
320
321struct tiff : detail::io_impl<detail::io_tiff> {}; // 定义tiff结构体,继承自io_impl
322
323#if LIBCARLA_IMAGE_WITH_PNG_SUPPORT // 如果支持PNG格式
324
325struct any : detail::io_any<detail::io_png, detail::io_tiff, detail::io_jpeg> {}; // 定义any结构体,支持PNG、TIFF和JPEG
326
327#elif LIBCARLA_IMAGE_WITH_TIFF_SUPPORT // 如果不支持PNG但支持TIFF
328
329struct any : detail::io_any<detail::io_tiff, detail::io_jpeg> {}; // 定义any结构体,支持TIFF和JPEG
330
331#else // 如果以上都不支持
332
333struct any : detail::io_any<detail::io_jpeg> {}; // 定义any结构体,仅支持JPEG
334
335#endif
336
337} // namespace io
338} // namespace image
339} // namespace carla
#define DEBUG_ASSERT(predicate)
Definition Debug.h:68
#define LIBCARLA_IMAGE_WITH_TIFF_SUPPORT
#define LIBCARLA_IMAGE_WITH_JPEG_SUPPORT
#define LIBCARLA_IMAGE_WITH_PNG_SUPPORT
CARLA模拟器的主命名空间。
Definition Carla.cpp:139