diff --git a/loadrunable.cpp b/loadrunable.cpp index a5a4428..a12204e 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -517,10 +517,11 @@ bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr rawimage, ImageInfoD void ConvertRunable::run() { + qDebug() << m_infile << m_outfile; ImageInfoData imageinfo; std::shared_ptr rawimage; loadImage(m_infile, imageinfo, rawimage); @@ -646,6 +648,18 @@ void ConvertRunable::run() image.addFITSKeyword({record.key.toStdString(), record.value.toString().toStdString(), record.comment.toStdString()}); } + if(m_params.compressionType.startsWith("zstd") && LibXISF::DataBlock::CompressionCodecSupported(LibXISF::DataBlock::ZSTD)) + image.setCompression(LibXISF::DataBlock::ZSTD, m_params.compressionLevel); + else if(m_params.compressionType.startsWith("lz4hc")) + image.setCompression(LibXISF::DataBlock::LZ4HC, m_params.compressionLevel); + else if(m_params.compressionType.startsWith("lz4")) + image.setCompression(LibXISF::DataBlock::LZ4, m_params.compressionLevel); + else if(m_params.compressionType.startsWith("zlib")) + image.setCompression(LibXISF::DataBlock::Zlib, m_params.compressionLevel); + + if(m_params.compressionType.endsWith("+sh")) + image.setByteshuffling(true); + xisf.writeImage(image); xisf.save(m_outfile.toLocal8Bit().data()); } @@ -661,6 +675,13 @@ void ConvertRunable::run() fitsfile *fw; if(QFileInfo(m_outfile).exists())QFile::remove(m_outfile); fits_create_diskfile(&fw, m_outfile.toLocal8Bit().data(), &status); + if(!m_params.compressionType.isEmpty()) + { + if(m_params.compressionType == "gzip") + fits_set_compression_type(fw, GZIP_1, &status); + else if(m_params.compressionType == "rice") + fits_set_compression_type(fw, RICE_1, &status); + } writeFITSImage(fw, rawimage, imageinfo); fits_close_file(fw, &status); } @@ -694,3 +715,12 @@ void ConvertRunable::run() } } } + +ConvertRunable::ConvertParams::ConvertParams(const QVariantMap &map) +{ + if(map.contains("compressionLevel")) + compressionLevel = map["compressionLevel"].toInt(); + + if(map.contains("compressionType")) + compressionType = map["compressionType"].toString(); +} diff --git a/loadrunable.h b/loadrunable.h index 9005cef..a211778 100644 --- a/loadrunable.h +++ b/loadrunable.h @@ -24,14 +24,24 @@ public: void run() override; }; + class ConvertRunable : public QRunnable { +public: + struct ConvertParams + { + int compressionLevel = -1; + QString compressionType; + ConvertParams(){} + ConvertParams(const QVariantMap &map); + }; + ConvertRunable(const QString &in, const QString &out, const QString &format, const ConvertParams ¶ms = ConvertParams()); + void run() override; +private: QString m_infile; QString m_outfile; QString m_format; -public: - ConvertRunable(const QString &in, const QString &out, const QString &format); - void run() override; + ConvertParams m_params; }; #endif // LOADRUNABLE_H diff --git a/scriptengine.cpp b/scriptengine.cpp index 430d328..7542c38 100644 --- a/scriptengine.cpp +++ b/scriptengine.cpp @@ -66,9 +66,8 @@ bool ScriptEngine::isMarked(const File *file) const return _database->isMarked(file->absoluteFilePath()); } -bool ScriptEngine::convert(File *file, QString &outpath, QJSValue ¶ms) +bool ScriptEngine::convert(File *file, QString &outpath, QString format, QVariantMap params) { - QString format = params.toString(); QString path; QDir dir(_outputDir); QFileInfo info(outpath); @@ -80,7 +79,7 @@ bool ScriptEngine::convert(File *file, QString &outpath, QJSValue ¶ms) info.setFile(path); //qDebug() << info.absolutePath() + "/" + info.completeBaseName() + "." + format.toLower(); - _pool->start(new ConvertRunable(file->absoluteFilePath(), info.absolutePath() + "/" + info.completeBaseName() + "." + format.toLower(), format)); + _pool->start(new ConvertRunable(file->absoluteFilePath(), info.absolutePath() + "/" + info.completeBaseName() + "." + format.toLower(), format, params)); return true; } diff --git a/scriptengine.h b/scriptengine.h index cee99e6..50a278f 100644 --- a/scriptengine.h +++ b/scriptengine.h @@ -33,7 +33,7 @@ public: Q_INVOKABLE void mark(File *file); Q_INVOKABLE void unmark(File *file); Q_INVOKABLE bool isMarked(const File *file) const; - Q_INVOKABLE bool convert(File *file, QString &outpath, QJSValue ¶ms); + Q_INVOKABLE bool convert(File *file, QString &outpath, QString format, QVariantMap params); QJSValue newObject(); public slots: void run();