vcglib/wrap/qt/img_qt_io.h

265 lines
9.0 KiB
C
Raw Normal View History

2009-07-14 16:45:06 +02:00
#ifndef IMG_QT_IO_H_
#define IMG_QT_IO_H_
#include <fstream>
// input/output using the qt system
#include <QImage>
#include "wrap/qt/img_qt_convert.h"
#include "img/img_io.h"
namespace img {
template<typename ScalarType, bool Safe>
inline void openQtY(const QString filename, Image<1,ScalarType,Safe> &image)
{
convert_QImage_to_Y(QImage(filename),image);
}
template<typename ScalarType, bool Safe>
inline void openQtRGB(const QString filename, Image<3,ScalarType,Safe> &image)
{
convert_QImage_to_RGB(QImage(filename),image);
}
//// queste le tengo commentate perche` ora non mi servono
//template<typename ScalarType, bool Safe>
//inline void openQtRGBA(const QString filename, Image<4,ScalarType,Safe> &image)
//{
// convert_QImage_to_RGBA(QImage(filename),image);
//}
//
//template<typename ScalarType, bool Safe>
//inline void openQtY(const char *filename, Image<1,ScalarType,Safe> &image)
//{
// openQtY(QString(filename),image);
//}
//
//template<typename ScalarType, bool Safe>
//inline void openQtRGB(const char *filename, Image<3,ScalarType,Safe> &image)
//{
// openQtRGB(QString(filename),image);
//}
//
//template<typename ScalarType, bool Safe>
//inline void openQtRGBA(const char *filename, Image<4,ScalarType,Safe> &image)
//{
// openQtRGBA(QString(filename),image);
//}
//
template<typename ScalarType, bool Safe>
inline bool saveQtY(const Image<1,ScalarType,Safe> &image,const QString filename)
{
QImage qimage;
convert_Y_to_QImage(image,qimage);
bool success = qimage.save(filename);
assert(success);
if(Safe){
if(!success) throw ImageException("cannot save image");
}
return success;
}
template<typename ScalarType, bool Safe>
inline bool saveQtRGB(const Image<3,ScalarType,Safe> &image,const QString filename)
{
QImage qimage;
convert_RGB_to_QImage(image,qimage);
bool success = qimage.save(filename);
assert(success);
if(Safe){
if(!success) throw ImageException("cannot save image");
}
return success;
}
//// queste le tengo commentate perche` ora non mi servono
//template<typename ScalarType, bool Safe>
//inline bool saveQtRGBA(const Image<4,ScalarType,Safe> &image,const QString filename)
//{
// QImage qimage;
// convert_RGBA_to_QImage(image,qimage);
// bool success = qimage.save(filename);
// assert(success);
// if(Safe){
// if(!success) throw ImageException("cannot save image");
// }
// return success;
//}
//
//template<typename ScalarType, bool Safe>
//inline bool saveQtY(const Image<1,ScalarType,Safe> &image,const char *filename)
//{
// return saveQtY(image,QString(filename));
//}
//
//template<typename ScalarType, bool Safe>
//inline bool saveQtRGB(const Image<3,ScalarType,Safe> &image,const char *filename)
//{
// return saveQtRGB(image,QString(filename));
//}
//
//template<typename ScalarType, bool Safe>
//inline bool saveQtRGBA(const Image<4,ScalarType,Safe> &image,const char *filename)
//{
// return saveQtRGBA(image,QString(filename));
//}
template<typename ScalarType, bool Safe>
inline bool savePGM(const Image<1,ScalarType,Safe> &image, const QString filename)
{
assert(image.isValid());
assert(image.attributes.hasRange(ScalarType(0.0),ScalarType(255.0)));
assert(filename.endsWith(".pgm",Qt::CaseInsensitive));
if(Safe){
if(!image.isValid()) throw ImageException("Invalid image");
if(!image.attributes.hasRange(ScalarType(0.0),ScalarType(255.0))) throw ImageException("Invalid range attribute");
if(!filename.endsWith(".pgm",Qt::CaseInsensitive)) throw ImageException("filename is not .pgm");
}
using namespace std;
ofstream file (filename.toStdString().c_str(), ios::out|ios::binary|ios::trunc);
if (file.is_open()) {
QString header = QString("P5 %1 %2 255\n").arg(image.width()).arg(image.height());
file << header.toStdString().c_str();
for (int y_coord = 0; y_coord < image.height(); ++y_coord)
for (int x_coord = 0; x_coord < image.width(); ++x_coord){
unsigned char v = static_cast<unsigned char>(valueAsInt(clampValue(image.getValue(x_coord,y_coord,0))));
file << v;
}
file.close();
return true;
}
if(Safe)
throw ImageException("Unable to open file");
return false;
}
// range and gamma aware I/O
template<typename ScalarType, bool Safe>
inline void open_and_normalize_range_Y(const QString filename, Image<1,ScalarType,Safe> &range_0_1_image)
{
Image<1,ScalarType,Safe> range_0_255_image;
openQtY(filename,range_0_255_image);
convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
}
template<typename ScalarType, bool Safe>
inline void open_and_normalize_range_RGB(const QString filename, Image<3,ScalarType,Safe> &range_0_1_image)
{
Image<3,ScalarType,Safe> range_0_255_image;
openQtRGB(filename,range_0_255_image);
convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
}
template<typename ScalarType, bool Safe>
inline void open_normalize_range_and_SRGB_linearize_RGB(const QString filename, Image<3,ScalarType,Safe> &linear_image)
{
Image<3,ScalarType,Safe> range_0_1_image;
open_and_normalize_range_RGB(filename, range_0_1_image);
range_0_1_image.attributes.setColorspace(img::SRGB); // assumes sRGB colorspace for gamma compression
convert_gamma_precompensated_srgb_to_linear_srgb(range_0_1_image,linear_image);
}
template<typename ScalarType, bool Safe>
inline bool adjust_range_and_save_PGM(const Image<1,ScalarType,Safe> &range_0_1_image, const QString filename)
{
Image<1,ScalarType,Safe> range_0_255_image;
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
return savePGM(range_0_255_image,filename);
}
template<typename ScalarType, bool Safe>
inline bool SRGB_compress_adjust_range_and_save_PGM(const Image<1,ScalarType,Safe> &linear_image, const QString filename)
{
Image<1,ScalarType,Safe> range_0_1_image;
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
return adjust_range_and_save_PGM(range_0_1_image,filename);
}
template<typename ScalarType, bool Safe>
inline bool adjust_range_and_save_RGB(const Image<3,ScalarType,Safe> &range_0_1_image, const QString filename)
{
Image<3,ScalarType,Safe> range_0_255_image;
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
return saveQtRGB(range_0_255_image,filename);
}
template<typename ScalarType, bool Safe>
inline bool SRGB_compress_adjust_range_and_save_RGB(const Image<3,ScalarType,Safe> &linear_image,const QString filename)
{
Image<3,ScalarType,Safe> range_0_1_image;
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
return adjust_range_and_save_RGB(range_0_1_image,filename);
}
template<typename ScalarType, bool Safe>
inline bool adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &range_0_1_image, const QString filename)
{
Image<1,ScalarType,Safe> range_0_255_image;
convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
return saveQtY(range_0_255_image,filename);
}
template<typename ScalarType, bool Safe>
inline bool SRGB_compress_adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &linear_image,const QString filename)
{
Image<1,ScalarType,Safe> range_0_1_image;
convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
return adjust_range_and_save_Y(range_0_1_image,filename);
}
//// queste le tengo commentate perche` ora non mi servono
//template<typename ScalarType, bool Safe>
//inline void open_normalize_range_and_SRGB_linearize_Y(const QString filename, Image<1,ScalarType,Safe> &linear_image)
//{
// Image<1,ScalarType,Safe> range_0_255_image, range_0_1_image;
// openQtY(filename,range_0_255_image);
// range_0_255_image.attributes.setColorspace(img::SRGB); // assumes sRGB colorspace (for gamma compression)
// convert_range_0_255_to_0_1(range_0_255_image,range_0_1_image);
// convert_gamma_precompensated_srgb_to_linear_srgb(range_0_1_image,linear_image);
//}
//
//template<typename ScalarType, bool Safe>
//inline bool SRGB_compress_adjust_range_and_save_Y(const Image<1,ScalarType,Safe> &linear_image,const QString filename)
//{
// Image<1,ScalarType,Safe> range_0_1_image, range_0_255_image;
// convert_linear_srgb_to_gamma_precompensated_srgb(linear_image,range_0_1_image);
// convert_range_0_1_to_0_255(range_0_1_image,range_0_255_image);
// return aveQtY(range_0_255_image,filename);
//}
//
///// queste chi gli serve se le riimplementa, ora non c'ho tempo
//template <class PIXELTYPE, bool SAFE>
//inline void dumpNormalized(const Image<PIXELTYPE,SAFE> &image,const QString filename)
//{
// save(image::getNormalized(image),filename);
//}
//
//template <class PIXELTYPE, bool SAFE>
//inline void dumpNormalized(const Image<PIXELTYPE,SAFE> &image,const char *filename)
//{
// saveNormalized(image,QString(filename));
//}
//
//template <class PIXELTYPE, bool SAFE>
//inline void dumpAsRaw(const Image<PIXELTYPE,SAFE> &image,const QString filename)
//{
// dumpAsRaw(image,filename.toStdString().c_str());
//}
//
//template <class PIXELTYPE, bool SAFE>
//inline void dumpAsAscii(const Image<PIXELTYPE,SAFE> &image,const QString filename)
//{
// dumpAsAscii(image,filename.toStdString().c_str());
//}
//
} //end namespace img
#endif /*IMG_QT_IO_H_*/