Get rid of QPixmap

This commit is contained in:
2021-04-20 23:28:52 +02:00
parent 1ba6a0ff19
commit f173e48a26
7 changed files with 38 additions and 57 deletions
+3 -10
View File
@@ -19,19 +19,18 @@ Image::Image(const QString name, ImageRingList *ringList) :
void Image::load() void Image::load()
{ {
if(m_pixmap.isNull() && !m_rawImage && !m_loading) if(!m_rawImage && !m_loading)
{ {
m_loading = true; m_loading = true;
m_released = false; m_released = false;
QThreadPool::globalInstance()->start(new LoadRunable(m_name, this, m_ringList->analyzeLevel())); QThreadPool::globalInstance()->start(new LoadRunable(m_name, this, m_ringList->analyzeLevel()));
} }
if(!m_loading && (!m_pixmap.isNull() || m_rawImage)) if(!m_loading && m_rawImage)
emit pixmapLoaded(this); emit pixmapLoaded(this);
} }
void Image::release() void Image::release()
{ {
m_pixmap = QPixmap();
m_rawImage.reset(); m_rawImage.reset();
m_released = true; m_released = true;
m_loading = false; m_loading = false;
@@ -42,11 +41,6 @@ QString Image::name() const
return m_name; return m_name;
} }
QPixmap Image::pixmap() const
{
return m_pixmap;
}
RawImage *Image::rawImage() RawImage *Image::rawImage()
{ {
return m_rawImage.get(); return m_rawImage.get();
@@ -62,12 +56,11 @@ bool Image::isCurrent() const
return !m_released; return !m_released;
} }
void Image::imageLoaded(QImage img, void *rawImage, ImageInfoData info) void Image::imageLoaded(void *rawImage, ImageInfoData info)
{ {
m_loading = false; m_loading = false;
if(!m_released) if(!m_released)
{ {
m_pixmap = QPixmap::fromImage(img);
m_rawImage.reset(static_cast<RawImage*>(rawImage)); m_rawImage.reset(static_cast<RawImage*>(rawImage));
m_info = info; m_info = info;
emit pixmapLoaded(this); emit pixmapLoaded(this);
+1 -3
View File
@@ -17,7 +17,6 @@ class Image : public QObject
bool m_loading; bool m_loading;
bool m_released; bool m_released;
bool m_current; bool m_current;
QPixmap m_pixmap;
std::unique_ptr<RawImage> m_rawImage; std::unique_ptr<RawImage> m_rawImage;
QString m_name; QString m_name;
ImageInfoData m_info; ImageInfoData m_info;
@@ -27,14 +26,13 @@ public:
void load(); void load();
void release(); void release();
QString name() const; QString name() const;
QPixmap pixmap() const;
RawImage* rawImage(); RawImage* rawImage();
ImageInfoData info() const; ImageInfoData info() const;
bool isCurrent() const; bool isCurrent() const;
signals: signals:
void pixmapLoaded(Image *ptr); void pixmapLoaded(Image *ptr);
protected slots: protected slots:
void imageLoaded(QImage img, void *rawImage, ImageInfoData info); void imageLoaded(void *rawImage, ImageInfoData info);
}; };
typedef std::shared_ptr<Image> ImagePtr; typedef std::shared_ptr<Image> ImagePtr;
+1 -1
View File
@@ -19,7 +19,7 @@ const RawImageType rawImageTypes[] = {
{QOpenGLTexture::Red, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, true}, {QOpenGLTexture::Red, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, true},
{QOpenGLTexture::Red, QOpenGLTexture::R16_UNorm, QOpenGLTexture::UInt16, true}, {QOpenGLTexture::Red, QOpenGLTexture::R16_UNorm, QOpenGLTexture::UInt16, true},
{QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true}, {QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true},
{QOpenGLTexture::RGB, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, false}, {QOpenGLTexture::RGB, QOpenGLTexture::RGB8_UNorm, QOpenGLTexture::UInt8, false},
{QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false}, {QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
{QOpenGLTexture::RGB, QOpenGLTexture::RGB32F, QOpenGLTexture::Float32, false} {QOpenGLTexture::RGB, QOpenGLTexture::RGB32F, QOpenGLTexture::Float32, false}
}; };
+14 -31
View File
@@ -75,9 +75,9 @@ void printStarModel(int radius, const std::vector<double> &data, const Star &sta
std::cout << m.toStdString() << std::endl << std::endl; std::cout << m.toStdString() << std::endl << std::endl;
} }
bool loadRAW(QString path, ImageInfoData &info, RawImage **image, QImage *qimage) bool loadRAW(QString path, ImageInfoData &info, RawImage **image)
{ {
if(!image && !qimage) if(!image)
return false; return false;
LibRaw raw; LibRaw raw;
@@ -112,41 +112,24 @@ bool loadRAW(QString path, ImageInfoData &info, RawImage **image, QImage *qimage
memcpy((*image)->data(), &out[0], sizeof(uint16_t)*d); memcpy((*image)->data(), &out[0], sizeof(uint16_t)*d);
} }
if(qimage)
{
raw.dcraw_process();
libraw_processed_image_t *rawImg = raw.dcraw_make_mem_image();
QImage img(rawImg->width, rawImg->height, QImage::Format_RGB888);
uint scanLine = rawImg->width*rawImg->colors;
for(uint i=0; i<rawImg->height; i++)
{
memcpy(img.scanLine(i), rawImg->data+(i*scanLine), scanLine);
}
QString shutterSpeed = QString::number(raw.imgdata.other.shutter); QString shutterSpeed = QString::number(raw.imgdata.other.shutter);
if(raw.imgdata.other.shutter < 1) if(raw.imgdata.other.shutter < 1)
{ {
shutterSpeed = QString("1/%1s").arg(1.0f/raw.imgdata.other.shutter); shutterSpeed = QString("1/%1s").arg(1.0f/raw.imgdata.other.shutter);
} }
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.append(StringPair(QObject::tr("ISO"), QString::number(raw.imgdata.other.iso_speed)));
info.append(StringPair(QObject::tr("Shutter speed"), shutterSpeed)); info.append(StringPair(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
raw.dcraw_clear_mem(rawImg);
*qimage = img;
}
return true; return true;
} }
bool loadFITS(QString path, ImageInfoData &info, RawImage **image, QImage *qimage) bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
{ {
if(!image && !qimage) if(!image)
return false; return false;
fitsfile *file; fitsfile *file;
@@ -246,23 +229,22 @@ void LoadRunable::run()
QFileInfo finfo(m_file); QFileInfo finfo(m_file);
info.append(StringPair(QObject::tr("Filename"), finfo.fileName())); info.append(StringPair(QObject::tr("Filename"), finfo.fileName()));
QImage img;
RawImage *rawImage = nullptr; RawImage *rawImage = nullptr;
bool raw = false; bool raw = false;
if(m_file.endsWith(".CR2", Qt::CaseInsensitive)) if(m_file.endsWith(".CR2", Qt::CaseInsensitive))
{ {
timer.start(); timer.start();
loadRAW(m_file, info, &rawImage, nullptr); loadRAW(m_file, info, &rawImage);
raw = true; raw = true;
qDebug() << "LoadRaw" << timer.elapsed(); qDebug() << "LoadRaw" << timer.elapsed();
} }
else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive)) else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive))
{ {
loadFITS(m_file, info, &rawImage, nullptr); loadFITS(m_file, info, &rawImage);
} }
else else
{ {
img = QImage(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.append(StringPair(QObject::tr("Width"), QString::number(img.width())));
info.append(StringPair(QObject::tr("Height"), QString::number(img.height()))); info.append(StringPair(QObject::tr("Height"), QString::number(img.height())));
@@ -272,6 +254,7 @@ void LoadRunable::run()
loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE);
exif_data_free(exif); exif_data_free(exif);
} }
rawImage = new RawImage(img);
} }
if(rawImage && m_analyzeLevel >= Statistics) if(rawImage && m_analyzeLevel >= Statistics)
@@ -299,8 +282,8 @@ void LoadRunable::run()
int numPeaks = medianImage->findPeaks(median+stdDev*2, 20, peaks); int numPeaks = medianImage->findPeaks(median+stdDev*2, 20, peaks);
delete medianImage; delete medianImage;
qDebug() << "peaks" << timer.restart(); qDebug() << "peaks" << timer.restart();
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.append(StringPair(QObject::tr("Peaks"), QString::number(numPeaks)));
info.append(StringPair(QObject::tr("Peaks draw"), QString::number(peaks.size()))); info.append(StringPair(QObject::tr("Peaks draw"), QString::number(peaks.size())));
@@ -330,7 +313,7 @@ void LoadRunable::run()
stars.push_back(star); stars.push_back(star);
} }
} }
drawStars(img, stars); //drawStars(img, stars);
info.append(StringPair(QObject::tr("FWHM X"), QString::number(fwhmX/stars.size()))); 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.append(StringPair(QObject::tr("FWHM Y"), QString::number(fwhmY/stars.size())));
} }
@@ -338,5 +321,5 @@ void LoadRunable::run()
} }
} }
QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(QImage, img), Q_ARG(void*, rawImage), Q_ARG(ImageInfoData, info)); QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(void*, rawImage), Q_ARG(ImageInfoData, info));
} }
-4
View File
@@ -237,10 +237,6 @@ void MainWindow::pixmapLoaded(Image *image)
{ {
m_imageGL->setImage(image->rawImage()); m_imageGL->setImage(image->rawImage());
} }
else
{
m_imageGL->setImage(image->pixmap());
}
} }
void MainWindow::loadFile() void MainWindow::loadFile()
+9
View File
@@ -65,6 +65,15 @@ RawImage::RawImage(const RawImage &d)
d.m_img.copyTo(m_img); d.m_img.copyTo(m_img);
} }
RawImage::RawImage(const QImage &img)
{
QImage tmp = img.convertToFormat(QImage::Format_RGB888);
m_img.create(img.height(), img.width(), CV_8UC3);
for(int i=0; i<tmp.height(); i++)
std::memcpy(m_img.ptr(i), tmp.scanLine(i), tmp.width()*3);
}
bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const
{ {
cv::Scalar meanS, stdDevS; cv::Scalar meanS, stdDevS;
+2
View File
@@ -7,6 +7,7 @@
#include <math.h> #include <math.h>
#include <memory.h> #include <memory.h>
#include <opencv2/imgproc.hpp> #include <opencv2/imgproc.hpp>
#include <QImage>
class Peak class Peak
{ {
@@ -49,6 +50,7 @@ public:
RawImage(int w, int h, ImgType type); RawImage(int w, int h, ImgType type);
RawImage(cv::Mat &img); RawImage(cv::Mat &img);
RawImage(const RawImage &d); RawImage(const RawImage &d);
RawImage(const QImage &img);
bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const; bool imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const;
void rect(int &x, int &y, int w, int h, std::vector<double> &r) const; void rect(int &x, int &y, int w, int h, std::vector<double> &r) const;
int findPeaks(double background, double distance, std::vector<Peak> &peaks) const; int findPeaks(double background, double distance, std::vector<Peak> &peaks) const;