2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as
4 * published by the Free Software Foundation, either version 3 of the
5 * License, or (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr )
20 * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
24 * Implementation of inline methods defined in STBWriter.h
26 * This file is part of the DGtal library.
29 #ifndef NO_ADD_STBIMAGE_IMPLEMENT //To avoid duplicated linking errors (like LNK2005 in MSVC)
31 #define STB_IMAGE_WRITE_IMPLEMENTATION
32 #endif //NO_ADD_STBIMAGE_IMPLEMENT
33 #pragma GCC diagnostic push
34 #pragma GCC diagnostic ignored "-Wdeprecated"
35 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
36 #pragma clang diagnostic push
37 #pragma clang diagnostic ignored "-Wdeprecated"
38 #pragma clang diagnostic ignored "-Wmissing-field-initializers"
39 #include <stb/stb_image_write.h>
40 #pragma GCC diagnostic pop
41 #pragma clang diagnostic pop
43 ///////////////////////////////////////////////////////////////////////////////
44 // Interface - public :
47 template <typename TImageContainer, typename TFunctor>
50 DGtal::STBWriter<TImageContainer, TFunctor>::exportPNG(const std::string & filename,
51 const TImageContainer & anImage,
52 const Functor & aFunctor)
54 const int w = anImage.domain().upperBound()[0] - anImage.domain().lowerBound()[0] +1 ;
55 const int h = anImage.domain().upperBound()[1] - anImage.domain().lowerBound()[1] +1 ;
57 unsigned char *data = (unsigned char*)malloc( w * h * comp );
60 for(const auto &value: anImage)
62 Color v = aFunctor(value);
63 data[4*cpt] = v.red();
64 data[4*cpt+1] = v.green();
65 data[4*cpt+2] = v.blue();
66 data[4*cpt+3] = v.alpha();
69 const int error = stbi_write_png(filename.c_str(), w, h, comp, data, w*comp);
74 template <typename TImageContainer, typename TFunctor>
77 DGtal::STBWriter<TImageContainer, TFunctor>::exportBMP(const std::string & filename,
78 const TImageContainer & anImage,
79 const Functor & aFunctor)
81 const int w = anImage.domain().upperBound()[0] - anImage.domain().lowerBound()[0] +1 ;
82 const int h = anImage.domain().upperBound()[1] - anImage.domain().lowerBound()[1] +1 ;
84 unsigned char *data = (unsigned char*)malloc( sizeof(unsigned char)*w * h * comp);
87 for(const auto &value: anImage)
89 Color v = aFunctor(value);
90 data[4*cpt] = v.red();
91 data[4*cpt+1] = v.green();
92 data[4*cpt+2] = v.blue();
93 data[4*cpt+3] = v.alpha();
96 const int error = stbi_write_bmp(filename.c_str(), w, h, comp, data);
102 template <typename TImageContainer, typename TFunctor>
105 DGtal::STBWriter<TImageContainer, TFunctor>::exportTGA(const std::string & filename,
106 const TImageContainer & anImage,
107 const Functor & aFunctor)
109 const int w = anImage.domain().upperBound()[0] - anImage.domain().lowerBound()[0] +1 ;
110 const int h = anImage.domain().upperBound()[1] - anImage.domain().lowerBound()[1] +1 ;
112 unsigned char *data = (unsigned char*)malloc( sizeof(unsigned char)*w * h * comp);
115 for(const auto &value: anImage)
117 Color v = aFunctor(value);
118 data[4*cpt] = v.red();
119 data[4*cpt+1] = v.green();
120 data[4*cpt+2] = v.blue();
121 data[4*cpt+3] = v.alpha();
124 const int error = stbi_write_bmp(filename.c_str(), w, h, comp, data);
128 template <typename TImageContainer, typename TFunctor>
131 DGtal::STBWriter<TImageContainer, TFunctor>::exportJPG(const std::string & filename,
132 const TImageContainer & anImage,
133 const Functor & aFunctor,
136 const int w = anImage.domain().upperBound()[0] - anImage.domain().lowerBound()[0] +1 ;
137 const int h = anImage.domain().upperBound()[1] - anImage.domain().lowerBound()[1] +1 ;
139 unsigned char *data = (unsigned char*)malloc( sizeof(unsigned char)*w * h * comp);
142 for(const auto &value: anImage)
144 Color v = aFunctor(value);
145 data[4*cpt] = v.red();
146 data[4*cpt+1] = v.green();
147 data[4*cpt+2] = v.blue();
148 data[4*cpt+3] = v.alpha();
151 const int error = stbi_write_jpg(filename.c_str(), w, h, comp, data, quality);
156 ///////////////////////////////////////////////////////////////////////////////