#ifndef IMG_QT_IO_H_ #define IMG_QT_IO_H_ #include // input/output using the qt system #include #include "wrap/qt/img_qt_convert.h" #include "img/img_io.h" namespace img { template inline void openQtY(const QString filename, Image<1,ScalarType,Safe> &image) { convert_QImage_to_Y(QImage(filename),image); } template 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 //inline void openQtRGBA(const QString filename, Image<4,ScalarType,Safe> &image) //{ // convert_QImage_to_RGBA(QImage(filename),image); //} // //template //inline void openQtY(const char *filename, Image<1,ScalarType,Safe> &image) //{ // openQtY(QString(filename),image); //} // //template //inline void openQtRGB(const char *filename, Image<3,ScalarType,Safe> &image) //{ // openQtRGB(QString(filename),image); //} // //template //inline void openQtRGBA(const char *filename, Image<4,ScalarType,Safe> &image) //{ // openQtRGBA(QString(filename),image); //} // template 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 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 //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 //inline bool saveQtY(const Image<1,ScalarType,Safe> &image,const char *filename) //{ // return saveQtY(image,QString(filename)); //} // //template //inline bool saveQtRGB(const Image<3,ScalarType,Safe> &image,const char *filename) //{ // return saveQtRGB(image,QString(filename)); //} // //template //inline bool saveQtRGBA(const Image<4,ScalarType,Safe> &image,const char *filename) //{ // return saveQtRGBA(image,QString(filename)); //} template 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(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 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 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 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 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 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 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 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 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 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 //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 //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 //inline void dumpNormalized(const Image &image,const QString filename) //{ // save(image::getNormalized(image),filename); //} // //template //inline void dumpNormalized(const Image &image,const char *filename) //{ // saveNormalized(image,QString(filename)); //} // //template //inline void dumpAsRaw(const Image &image,const QString filename) //{ // dumpAsRaw(image,filename.toStdString().c_str()); //} // //template //inline void dumpAsAscii(const Image &image,const QString filename) //{ // dumpAsAscii(image,filename.toStdString().c_str()); //} // } //end namespace img #endif /*IMG_QT_IO_H_*/