1 #include "image_loader.h"
\r
3 #include <common/exception/Exceptions.h>
\r
4 #include <common/utility/string.h>
\r
6 #if defined(_MSC_VER)
\r
7 #pragma warning (disable : 4714) // marked as __forceinline not inlined
\r
10 #include <boost/filesystem.hpp>
\r
11 #include <boost/exception/errinfo_file_name.hpp>
\r
12 #include <boost/thread/once.hpp>
\r
16 std::shared_ptr<FIBITMAP> load_image(const std::string& filename)
\r
18 struct FreeImage_initializer
\r
20 FreeImage_initializer(){FreeImage_Initialise(true);}
\r
21 ~FreeImage_initializer(){FreeImage_DeInitialise();}
\r
24 if(!boost::filesystem::exists(filename))
\r
25 BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(filename));
\r
27 FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
\r
28 fif = FreeImage_GetFileType(filename.c_str(), 0);
\r
29 if(fif == FIF_UNKNOWN)
\r
30 fif = FreeImage_GetFIFFromFilename(filename.c_str());
\r
32 if(fif == FIF_UNKNOWN || !FreeImage_FIFSupportsReading(fif))
\r
33 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
\r
35 auto bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Load(fif, filename.c_str(), 0), FreeImage_Unload);
\r
37 if(FreeImage_GetBPP(bitmap.get()) != 32)
\r
39 bitmap = std::shared_ptr<FIBITMAP>(FreeImage_ConvertTo32Bits(bitmap.get()), FreeImage_Unload);
\r
41 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
\r
47 std::shared_ptr<FIBITMAP> load_image(const std::wstring& filename)
\r
49 return load_image(narrow(filename));
\r