From c7e36bd4d6f4a94be01c42b0a3c93d99f00f083c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Fri, 8 Apr 2022 12:36:13 +0200 Subject: [PATCH] Refractor ImageInfoData --- imageinfo.cpp | 41 +++++++++++++++-------- imageinfo.h | 17 ++++++++-- loadrunable.cpp | 86 ++++++++++++++++++++++++++++++++----------------- mainwindow.cpp | 2 +- 4 files changed, 99 insertions(+), 47 deletions(-) diff --git a/imageinfo.cpp b/imageinfo.cpp index bac61a2..e5af686 100644 --- a/imageinfo.cpp +++ b/imageinfo.cpp @@ -1,24 +1,39 @@ #include "imageinfo.h" +static const QVector noEditableKey = {"SIMPLE", "BITPIX", "NAXIS", "NAXIS1", "NAXIS2", "NAXIS3", "EXTEND", "BZERO", "BSCALE"}; + +bool FITSRecord::editable() const +{ + return noEditableKey.count(key); +} + ImageInfo::ImageInfo(QWidget *parent) : QTreeWidget(parent) { - setColumnCount(2); - setHeaderLabels({tr("Property"), tr("Value")}); + setColumnCount(3); + setHeaderLabels({tr("Property"), tr("Value"), tr("Comment")}); + setIndentation(5); } -void ImageInfo::setInfo(ImageInfoData info) +void ImageInfo::setInfo(const ImageInfoData &info) { clear(); - QList items; - QTreeWidgetItem *w; - int i=0; - for(StringPair item : info) + if(info.fitsHeader.size()) { - w = new QTreeWidgetItem({item.first, item.second}); - w->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); - - items.append(w); - i++; + QTreeWidgetItem *fitsHeader = new QTreeWidgetItem({tr("FITS Header")}); + for(const FITSRecord &record : info.fitsHeader) + { + new QTreeWidgetItem(fitsHeader, {record.key, record.value.toString(), record.comment}); + } + addTopLevelItem(fitsHeader); } - insertTopLevelItems(0, items); + if(info.info.size()) + { + QTreeWidgetItem *infoHeader = new QTreeWidgetItem({tr("Image info")}); + for(auto &item : info.info) + { + new QTreeWidgetItem(infoHeader, {item.first, item.second}); + } + addTopLevelItem(infoHeader); + } + expandAll(); } diff --git a/imageinfo.h b/imageinfo.h index 65c83d7..9df1d41 100644 --- a/imageinfo.h +++ b/imageinfo.h @@ -3,8 +3,19 @@ #include -typedef QPair StringPair; -typedef QVector ImageInfoData; +struct FITSRecord +{ + QByteArray key; + QVariant value; + QByteArray comment; + bool editable() const; +}; + +struct ImageInfoData +{ + QVector fitsHeader; + QVector> info; +}; Q_DECLARE_METATYPE(ImageInfoData); @@ -22,7 +33,7 @@ class ImageInfo : public QTreeWidget public: ImageInfo(QWidget *parent); public slots: - void setInfo(ImageInfoData info); + void setInfo(const ImageInfoData &info); }; #endif // IMAGEINFO_H diff --git a/loadrunable.cpp b/loadrunable.cpp index bd12dc6..832aeb5 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -26,7 +26,7 @@ void loadExifEntry(ImageInfoData &info, ExifContent *content, ExifTag tag) if(entry) { exif_entry_get_value(entry, val, sizeof(val)); - info.append(StringPair(exif_tag_get_title(tag), QString(val))); + info.info.append({exif_tag_get_title(tag), val}); } } @@ -119,14 +119,49 @@ bool loadRAW(QString path, ImageInfoData &info, RawImage **image) } //info.append(StringPair(QObject::tr("Width"), QString::number(rawImg->width))); //info.append(StringPair(QObject::tr("Height"), QString::number(rawImg->height))); - info.append(StringPair(QObject::tr("ISO"), QString::number(raw.imgdata.other.iso_speed))); - info.append(StringPair(QObject::tr("Shutter speed"), shutterSpeed)); + info.info.append({QObject::tr("ISO"), QString::number(raw.imgdata.other.iso_speed)}); + info.info.append({QObject::tr("Shutter speed"), shutterSpeed}); #if LIBRAW_MINOR_VERSION>=19 // info.append(StringPair(QObject::tr("Camera temperature"), QString::number(raw.imgdata.other.CameraTemperature))); #endif return true; } +void loadFITSHeader(fitsfile *file, ImageInfoData &info) +{ + int nexist; + int status = 0; + char key[FLEN_KEYWORD]; + char val[FLEN_VALUE]; + char comm[FLEN_COMMENT]; + char strval[FLEN_VALUE]; + QVariant var; + fits_get_hdrspace(file, &nexist, nullptr, &status); + for(int i=1; i<=nexist; i++) + { + fits_read_keyn(file, i, key, val, comm, &status); + fits_read_key(file, TSTRING, key, strval, nullptr, &status); + if(status == 0 || status == VALUE_UNDEFINED) + { + QString string(strval); + bool isint; + bool isdouble; + double vald = string.toDouble(&isdouble); + long long vall = string.toLongLong(&isint); + if(isint) + var = vall; + else if(isdouble) + var = vald; + else if(status == VALUE_UNDEFINED) + var = QVariant(); + else + var = strval; + status = 0; + info.fitsHeader.append({key, var, comm}); + } + } +} + bool loadFITS(QString path, ImageInfoData &info, RawImage **image) { if(!image) @@ -171,8 +206,8 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image) size_t w = naxes[0]; size_t h = naxes[1]; - info.append(StringPair(QObject::tr("Width"), QString::number(naxes[0]))); - info.append(StringPair(QObject::tr("Height"), QString::number(naxes[1]))); + info.info.append({QObject::tr("Width"), QString::number(naxes[0])}); + info.info.append({QObject::tr("Height"), QString::number(naxes[1])}); for (int i=1; i==1 || i<=naxes[2]; i++) { @@ -195,24 +230,15 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image) } } - int nheader = 0, more; - fits_get_hdrspace(file, &nheader, &more, &status); - for(int i=1; i<=nheader; i++) - { - char key[FLEN_KEYWORD]; - - char val[FLEN_VALUE]; - char comm[FLEN_COMMENT]; - fits_read_keyn(file, i, key, val, comm, &status); - info.append(StringPair(key, QString(val))); - } + loadFITSHeader(file, info); fits_close_file(file, &status); if(status) { char err[100]; fits_get_errstatus(status, err); - info.append(StringPair(QObject::tr("Error"), QString(err))); + info.info.append({QObject::tr("Error"), QString(err)}); + qDebug() << err; } return true; @@ -227,7 +253,7 @@ void LoadRunable::run() QElapsedTimer timer; ImageInfoData info; QFileInfo finfo(m_file); - info.append(StringPair(QObject::tr("Filename"), finfo.fileName())); + info.info.append({QObject::tr("Filename"), finfo.fileName()}); RawImage *rawImage = nullptr; bool raw = false; @@ -246,8 +272,8 @@ void LoadRunable::run() { QImage img(m_file); ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData()); - info.append(StringPair(QObject::tr("Width"), QString::number(img.width()))); - info.append(StringPair(QObject::tr("Height"), QString::number(img.height()))); + info.info.append({QObject::tr("Width"), QString::number(img.width())}); + info.info.append({QObject::tr("Height"), QString::number(img.height())}); if(exif) { loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); @@ -264,12 +290,12 @@ void LoadRunable::run() timer.start(); rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad); qDebug() << "image stats" << timer.restart(); - info.append(StringPair(QObject::tr("Mean"), QString::number(mean))); - info.append(StringPair(QObject::tr("Standart deviation"), QString::number(stdDev))); - info.append(StringPair(QObject::tr("Median"), QString::number(median))); - info.append(StringPair(QObject::tr("Minimum"), QString::number(min))); - info.append(StringPair(QObject::tr("Maximum"), QString::number(max))); - info.append(StringPair(QObject::tr("MAD"), QString::number(mad))); + info.info.append({QObject::tr("Mean"), QString::number(mean)}); + info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)}); + info.info.append({QObject::tr("Median"), QString::number(median)}); + info.info.append({QObject::tr("Minimum"), QString::number(min)}); + info.info.append({QObject::tr("Maximum"), QString::number(max)}); + info.info.append({QObject::tr("MAD"), QString::number(mad)}); if(m_analyzeLevel >= Peaks) { @@ -286,8 +312,8 @@ void LoadRunable::run() //if(m_analyzeLevel == Peaks) // drawPeaks(img, peaks); qDebug() << "draw peaks" << timer.restart(); - info.append(StringPair(QObject::tr("Peaks"), QString::number(numPeaks))); - info.append(StringPair(QObject::tr("Peaks draw"), QString::number(peaks.size()))); + info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)}); + info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())}); if(m_analyzeLevel>= Stars) { @@ -315,8 +341,8 @@ void LoadRunable::run() } } //drawStars(img, stars); - info.append(StringPair(QObject::tr("FWHM X"), QString::number(fwhmX/stars.size()))); - info.append(StringPair(QObject::tr("FWHM Y"), QString::number(fwhmY/stars.size()))); + info.info.append({QObject::tr("FWHM X"), QString::number(fwhmX/stars.size())}); + info.info.append({QObject::tr("FWHM Y"), QString::number(fwhmY/stars.size())}); } qDebug() << "Star fit" << timer.restart(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 5c820cc..0e8c1be 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -63,7 +63,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*))); connect(m_ringList, SIGNAL(currentImageChanged(int)), this, SLOT(updateWindowTitle())); - connect(m_ringList, SIGNAL(infoLoaded(ImageInfoData)), m_info, SLOT(setInfo(ImageInfoData))); + connect(m_ringList, SIGNAL(infoLoaded(ImageInfoData)), m_info, SLOT(setInfo(const ImageInfoData&))); connect(m_ringList, SIGNAL(currentImageChanged(int)), m_filesystem, SLOT(selectFile(int))); QMenu *fileMenu = new QMenu(tr("File"), this);