5
// input/output using the qt system
9
#include "wrap/qt/img_qt_convert.h"
10
#include "img/img_io.h"
14
template<typename ScalarType, bool Safe>
15
inline void openQtY(const QString filename, Image<1,ScalarType,Safe> &image)
17
convert_QImage_to_Y(QImage(filename),image);
20
template<typename ScalarType, bool Safe>
21
inline void openQtRGB(const QString filename, Image<3,ScalarType,Safe> &image)
23
convert_QImage_to_RGB(QImage(filename),image);
26
//// queste le tengo commentate perche` ora non mi servono
27
//template<typename ScalarType, bool Safe>
28
//inline void openQtRGBA(const QString filename, Image<4,ScalarType,Safe> &image)
30
// convert_QImage_to_RGBA(QImage(filename),image);
33
//template<typename ScalarType, bool Safe>
34
//inline void openQtY(const char *filename, Image<1,ScalarType,Safe> &image)
36
// openQtY(QString(filename),image);
39
//template<typename ScalarType, bool Safe>
40
//inline void openQtRGB(const char *filename, Image<3,ScalarType,Safe> &image)
42
// openQtRGB(QString(filename),image);
45
//template<typename ScalarType, bool Safe>
46
//inline void openQtRGBA(const char *filename, Image<4,ScalarType,Safe> &image)
48
// openQtRGBA(QString(filename),image);
51
template<typename ScalarType, bool Safe>
52
inline bool saveQtY(const Image<1,ScalarType,Safe> &image,const QString filename)
55
convert_Y_to_QImage(image,qimage);
56
bool success = qimage.save(filename);
59
if(!success) throw ImageException("cannot save image");
64
template<typename ScalarType, bool Safe>
65
inline bool saveQtRGB(const Image<3,ScalarType,Safe> &image,const QString filename)
68
convert_RGB_to_QImage(image,qimage);
69
bool success = qimage.save(filename);
72
if(!success) throw ImageException("cannot save image");
77
//// queste le tengo commentate perche` ora non mi servono
78
//template<typename ScalarType, bool Safe>
79
//inline bool saveQtRGBA(const Image<4,ScalarType,Safe> &image,const QString filename)
82
// convert_RGBA_to_QImage(image,qimage);
83
// bool success = qimage.save(filename);
86
// if(!success) throw ImageException("cannot save image");
91
//template<typename ScalarType, bool Safe>
92
//inline bool saveQtY(const Image<1,ScalarType,Safe> &image,const char *filename)
94
// return saveQtY(image,QString(filename));
97
//template<typename ScalarType, bool Safe>
98
//inline bool saveQtRGB(const Image<3,ScalarType,Safe> &image,const char *filename)
100
// return saveQtRGB(image,QString(filename));
103
//template<typename ScalarType, bool Safe>
104
//inline bool saveQtRGBA(const Image<4,ScalarType,Safe> &image,const char *filename)
106
// return saveQtRGBA(image,QString(filename));
109
template<typename ScalarType, bool Safe>
110
inline bool savePGM(const Image<1,ScalarType,Safe> &image, const QString filename)
112
assert(image.isValid());
113
assert(image.attributes.hasRange(ScalarType(0.0),ScalarType(255.0)));
114
assert(filename.endsWith(".pgm",Qt::CaseInsensitive));
116
if(!image.isValid()) throw ImageException("Invalid image");
117
if(!image.attributes.hasRange(ScalarType(0.0),ScalarType(255.0))) throw ImageException("Invalid range attribute");
118
if(!filename.endsWith(".pgm",Qt::CaseInsensitive)) throw ImageException("filename is not .pgm");
121
ofstream file (filename.toStdString().c_str(), ios::out|ios::binary|ios::trunc);
122
if (file.is_open()) {
123
QString header = QString("P5 %1 %2 255\n").arg(image.width()).arg(image.height());
124
file << header.toStdString().c_str();
126
for (int y_coord = 0; y_coord < image.height(); ++y_coord)
127
for (int x_coord = 0; x_coord < image.width(); ++x_coord){
128
unsigned char v = static_cast<unsigned char>(valueAsInt(clampValue(image.getValue(x_coord,y_coord,0))));
136
throw ImageException("Unable to open file");
140
// range and gamma aware I/O
142
template<typename ScalarType, bool Safe>
143
inline void open_and_normalize_range_Y(const QString filename, Image<1,ScalarType,Safe> &range_0_1_image)
145
Image<1,ScalarType,Safe> range_0_255_image;
146
openQtY(filename,range_0_255_image);
147
convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
150
template<typename ScalarType, bool Safe>
151
inline void open_and_normalize_range_RGB(const QString filename, Image<3,ScalarType,Safe> &range_0_1_image)
153
Image<3,ScalarType,Safe> range_0_255_image;
154
openQtRGB(filename,range_0_255_image);
155
convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
158
template<typename ScalarType, bool Safe>
159
inline void open_normalize_range_and_SRGB_linearize_RGB(const QString filename, Image<3,ScalarType,Safe> &linear_image)
161
Image<3,ScalarType,Safe> range_0_1_image;
162
open_and_normalize_range_RGB(filename, range_0_1_image);
163
range_0_1_image.attributes.setColorspace(img::SRGB); // assumes sRGB colorspace for gamma compression
164
convert_gamma_precompensated_srgb_to_linear_srgb(range_0_1_image,linear_image);
167
template<typename ScalarType, bool Safe>
168
inline bool adjust_range_and_save_PGM(const Image<1,ScalarType,Safe> &range_0_1_image, const QString filename)
170
Image<1,ScalarType,Safe> range_0_255_image;
171
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
172
return savePGM(range_0_255_image,filename);
175
template<typename ScalarType, bool Safe>
176
inline bool SRGB_compress_adjust_range_and_save_PGM(const Image<1,ScalarType,Safe> &linear_image, const QString filename)
178
Image<1,ScalarType,Safe> range_0_1_image;
179
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
180
return adjust_range_and_save_PGM(range_0_1_image,filename);
183
template<typename ScalarType, bool Safe>
184
inline bool adjust_range_and_save_RGB(const Image<3,ScalarType,Safe> &range_0_1_image, const QString filename)
186
Image<3,ScalarType,Safe> range_0_255_image;
187
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
188
return saveQtRGB(range_0_255_image,filename);
191
template<typename ScalarType, bool Safe>
192
inline bool SRGB_compress_adjust_range_and_save_RGB(const Image<3,ScalarType,Safe> &linear_image,const QString filename)
194
Image<3,ScalarType,Safe> range_0_1_image;
195
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
196
return adjust_range_and_save_RGB(range_0_1_image,filename);
199
template<typename ScalarType, bool Safe>
200
inline bool adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &range_0_1_image, const QString filename)
202
Image<1,ScalarType,Safe> range_0_255_image;
203
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
204
return saveQtY(range_0_255_image,filename);
207
template<typename ScalarType, bool Safe>
208
inline bool SRGB_compress_adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &linear_image,const QString filename)
210
Image<1,ScalarType,Safe> range_0_1_image;
211
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
212
return adjust_range_and_save_Y(range_0_1_image,filename);
215
//// queste le tengo commentate perche` ora non mi servono
216
//template<typename ScalarType, bool Safe>
217
//inline void open_normalize_range_and_SRGB_linearize_Y(const QString filename, Image<1,ScalarType,Safe> &linear_image)
219
// Image<1,ScalarType,Safe> range_0_255_image, range_0_1_image;
220
// openQtY(filename,range_0_255_image);
221
// range_0_255_image.attributes.setColorspace(img::SRGB); // assumes sRGB colorspace (for gamma compression)
222
// convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
223
// convert_gamma_precompensated_srgb_to_linear_srgb(range_0_1_image,linear_image);
226
//template<typename ScalarType, bool Safe>
227
//inline bool SRGB_compress_adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &linear_image,const QString filename)
229
// Image<1,ScalarType,Safe> range_0_1_image, range_0_255_image;
230
// convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
231
// convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
232
// return aveQtY(range_0_255_image,filename);
236
///// queste chi gli serve se le riimplementa, ora non c'ho tempo
237
//template <class PIXELTYPE, bool SAFE>
238
//inline void dumpNormalized(const Image<PIXELTYPE,SAFE> &image,const QString filename)
240
// save(image::getNormalized(image),filename);
243
//template <class PIXELTYPE, bool SAFE>
244
//inline void dumpNormalized(const Image<PIXELTYPE,SAFE> &image,const char *filename)
246
// saveNormalized(image,QString(filename));
249
//template <class PIXELTYPE, bool SAFE>
250
//inline void dumpAsRaw(const Image<PIXELTYPE,SAFE> &image,const QString filename)
252
// dumpAsRaw(image,filename.toStdString().c_str());
255
//template <class PIXELTYPE, bool SAFE>
256
//inline void dumpAsAscii(const Image<PIXELTYPE,SAFE> &image,const QString filename)
258
// dumpAsAscii(image,filename.toStdString().c_str());
262
} //end namespace img
264
#endif /*IMG_QT_IO_H_*/