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"
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)
{
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<QTreeWidgetItem*> 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});
}
insertTopLevelItems(0, items);
addTopLevelItem(fitsHeader);
}
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>
typedef QPair<QString, QString> StringPair;
typedef QVector<StringPair> ImageInfoData;
struct FITSRecord
{
QByteArray key;
QVariant value;
QByteArray comment;
bool editable() const;
};
struct ImageInfoData
{
QVector<FITSRecord> fitsHeader;
QVector<QPair<QString, QString>> 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
+56 -30
View File
@@ -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();
}
+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(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);