Refractor ImageInfoData

This commit is contained in:
2022-04-08 12:36:13 +02:00
parent 5a8582c8b0
commit c7e36bd4d6
4 changed files with 99 additions and 47 deletions
+28 -13
View File
@@ -1,24 +1,39 @@
#include "imageinfo.h" #include "imageinfo.h"
static const QVector<QByteArray> noEditableKey = {"SIMPLE", "BITPIX", "NAXIS", "NAXIS1", "NAXIS2", "NAXIS3", "EXTEND", "BZERO", "BSCALE"};
bool FITSRecord::editable() const
{
return noEditableKey.count(key);
}
ImageInfo::ImageInfo(QWidget *parent) : QTreeWidget(parent) ImageInfo::ImageInfo(QWidget *parent) : QTreeWidget(parent)
{ {
setColumnCount(2); setColumnCount(3);
setHeaderLabels({tr("Property"), tr("Value")}); setHeaderLabels({tr("Property"), tr("Value"), tr("Comment")});
setIndentation(5);
} }
void ImageInfo::setInfo(ImageInfoData info) void ImageInfo::setInfo(const ImageInfoData &info)
{ {
clear(); clear();
QList<QTreeWidgetItem*> items; if(info.fitsHeader.size())
QTreeWidgetItem *w;
int i=0;
for(StringPair item : info)
{ {
w = new QTreeWidgetItem({item.first, item.second}); QTreeWidgetItem *fitsHeader = new QTreeWidgetItem({tr("FITS Header")});
w->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); for(const FITSRecord &record : info.fitsHeader)
{
items.append(w); new QTreeWidgetItem(fitsHeader, {record.key, record.value.toString(), record.comment});
i++; }
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();
} }
+14 -3
View File
@@ -3,8 +3,19 @@
#include <QTreeWidget> #include <QTreeWidget>
typedef QPair<QString, QString> StringPair; struct FITSRecord
typedef QVector<StringPair> ImageInfoData; {
QByteArray key;
QVariant value;
QByteArray comment;
bool editable() const;
};
struct ImageInfoData
{
QVector<FITSRecord> fitsHeader;
QVector<QPair<QString, QString>> info;
};
Q_DECLARE_METATYPE(ImageInfoData); Q_DECLARE_METATYPE(ImageInfoData);
@@ -22,7 +33,7 @@ class ImageInfo : public QTreeWidget
public: public:
ImageInfo(QWidget *parent); ImageInfo(QWidget *parent);
public slots: public slots:
void setInfo(ImageInfoData info); void setInfo(const ImageInfoData &info);
}; };
#endif // IMAGEINFO_H #endif // IMAGEINFO_H
+56 -30
View File
@@ -26,7 +26,7 @@ void loadExifEntry(ImageInfoData &info, ExifContent *content, ExifTag tag)
if(entry) if(entry)
{ {
exif_entry_get_value(entry, val, sizeof(val)); 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("Width"), QString::number(rawImg->width)));
//info.append(StringPair(QObject::tr("Height"), QString::number(rawImg->height))); //info.append(StringPair(QObject::tr("Height"), QString::number(rawImg->height)));
info.append(StringPair(QObject::tr("ISO"), QString::number(raw.imgdata.other.iso_speed))); info.info.append({QObject::tr("ISO"), QString::number(raw.imgdata.other.iso_speed)});
info.append(StringPair(QObject::tr("Shutter speed"), shutterSpeed)); info.info.append({QObject::tr("Shutter speed"), shutterSpeed});
#if LIBRAW_MINOR_VERSION>=19 #if LIBRAW_MINOR_VERSION>=19
// info.append(StringPair(QObject::tr("Camera temperature"), QString::number(raw.imgdata.other.CameraTemperature))); // info.append(StringPair(QObject::tr("Camera temperature"), QString::number(raw.imgdata.other.CameraTemperature)));
#endif #endif
return true; 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) bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
{ {
if(!image) if(!image)
@@ -171,8 +206,8 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
size_t w = naxes[0]; size_t w = naxes[0];
size_t h = naxes[1]; size_t h = naxes[1];
info.append(StringPair(QObject::tr("Width"), QString::number(naxes[0]))); info.info.append({QObject::tr("Width"), QString::number(naxes[0])});
info.append(StringPair(QObject::tr("Height"), QString::number(naxes[1]))); info.info.append({QObject::tr("Height"), QString::number(naxes[1])});
for (int i=1; i==1 || i<=naxes[2]; i++) 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; loadFITSHeader(file, info);
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)));
}
fits_close_file(file, &status); fits_close_file(file, &status);
if(status) if(status)
{ {
char err[100]; char err[100];
fits_get_errstatus(status, err); 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; return true;
@@ -227,7 +253,7 @@ void LoadRunable::run()
QElapsedTimer timer; QElapsedTimer timer;
ImageInfoData info; ImageInfoData info;
QFileInfo finfo(m_file); QFileInfo finfo(m_file);
info.append(StringPair(QObject::tr("Filename"), finfo.fileName())); info.info.append({QObject::tr("Filename"), finfo.fileName()});
RawImage *rawImage = nullptr; RawImage *rawImage = nullptr;
bool raw = false; bool raw = false;
@@ -246,8 +272,8 @@ void LoadRunable::run()
{ {
QImage img(m_file); QImage img(m_file);
ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData()); ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData());
info.append(StringPair(QObject::tr("Width"), QString::number(img.width()))); info.info.append({QObject::tr("Width"), QString::number(img.width())});
info.append(StringPair(QObject::tr("Height"), QString::number(img.height()))); info.info.append({QObject::tr("Height"), QString::number(img.height())});
if(exif) if(exif)
{ {
loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS);
@@ -264,12 +290,12 @@ void LoadRunable::run()
timer.start(); timer.start();
rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad); rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad);
qDebug() << "image stats" << timer.restart(); qDebug() << "image stats" << timer.restart();
info.append(StringPair(QObject::tr("Mean"), QString::number(mean))); info.info.append({QObject::tr("Mean"), QString::number(mean)});
info.append(StringPair(QObject::tr("Standart deviation"), QString::number(stdDev))); info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)});
info.append(StringPair(QObject::tr("Median"), QString::number(median))); info.info.append({QObject::tr("Median"), QString::number(median)});
info.append(StringPair(QObject::tr("Minimum"), QString::number(min))); info.info.append({QObject::tr("Minimum"), QString::number(min)});
info.append(StringPair(QObject::tr("Maximum"), QString::number(max))); info.info.append({QObject::tr("Maximum"), QString::number(max)});
info.append(StringPair(QObject::tr("MAD"), QString::number(mad))); info.info.append({QObject::tr("MAD"), QString::number(mad)});
if(m_analyzeLevel >= Peaks) if(m_analyzeLevel >= Peaks)
{ {
@@ -286,8 +312,8 @@ void LoadRunable::run()
//if(m_analyzeLevel == Peaks) //if(m_analyzeLevel == Peaks)
// drawPeaks(img, peaks); // drawPeaks(img, peaks);
qDebug() << "draw peaks" << timer.restart(); qDebug() << "draw peaks" << timer.restart();
info.append(StringPair(QObject::tr("Peaks"), QString::number(numPeaks))); info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)});
info.append(StringPair(QObject::tr("Peaks draw"), QString::number(peaks.size()))); info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())});
if(m_analyzeLevel>= Stars) if(m_analyzeLevel>= Stars)
{ {
@@ -315,8 +341,8 @@ void LoadRunable::run()
} }
} }
//drawStars(img, stars); //drawStars(img, stars);
info.append(StringPair(QObject::tr("FWHM X"), QString::number(fwhmX/stars.size()))); info.info.append({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 Y"), QString::number(fwhmY/stars.size())});
} }
qDebug() << "Star fit" << timer.restart(); qDebug() << "Star fit" << timer.restart();
} }
+1 -1
View File
@@ -63,7 +63,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*))); connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*)));
connect(m_ringList, SIGNAL(currentImageChanged(int)), this, SLOT(updateWindowTitle())); 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))); connect(m_ringList, SIGNAL(currentImageChanged(int)), m_filesystem, SLOT(selectFile(int)));
QMenu *fileMenu = new QMenu(tr("File"), this); QMenu *fileMenu = new QMenu(tr("File"), this);