You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
314 lines
5.0 KiB
C++
314 lines
5.0 KiB
C++
/*!
|
|
\file cimage.h
|
|
|
|
*/
|
|
|
|
#ifndef CIMAGE_H
|
|
#define CIMAGE_H
|
|
|
|
|
|
#include "libraw/libraw.h"
|
|
#include <opencv2/opencv.hpp>
|
|
|
|
#include <QImage>
|
|
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\class cImage cimage.h "cimage.h"
|
|
*/
|
|
class cImage : public QImage
|
|
{
|
|
public:
|
|
cImage();
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param size
|
|
\param format
|
|
*/
|
|
cImage(const QSize &size, QImage::Format format);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param width
|
|
\param height
|
|
\param format
|
|
*/
|
|
cImage(int width, int height, QImage::Format format);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param data
|
|
\param width
|
|
\param height
|
|
\param format
|
|
\param cleanupFunction
|
|
\param cleanupInfo
|
|
*/
|
|
cImage(uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param data
|
|
\param width
|
|
\param height
|
|
\param format
|
|
\param cleanupFunction
|
|
\param cleanupInfo
|
|
*/
|
|
cImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param data
|
|
\param width
|
|
\param height
|
|
\param bytesPerLine
|
|
\param format
|
|
\param cleanupFunction
|
|
\param cleanupInfo
|
|
*/
|
|
cImage(uchar *data, int width, int height, int bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param data
|
|
\param width
|
|
\param height
|
|
\param bytesPerLine
|
|
\param format
|
|
\param cleanupFunction
|
|
\param cleanupInfo
|
|
*/
|
|
cImage(const uchar *data, int width, int height, int bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param fileName
|
|
\param format
|
|
*/
|
|
cImage(const QString &fileName, const char *format = nullptr);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param image
|
|
*/
|
|
cImage(const QImage &image);
|
|
/*!
|
|
\brief
|
|
|
|
\fn cImage
|
|
\param other
|
|
*/
|
|
cImage(QImage &&other);
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn load
|
|
\param fileName
|
|
\param format
|
|
\return bool
|
|
*/
|
|
bool load(const QString &fileName, const char *format = nullptr);
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn isRaw
|
|
\return bool
|
|
*/
|
|
bool isRaw();
|
|
|
|
protected:
|
|
/*!
|
|
\brief
|
|
|
|
\enum Cam
|
|
*/
|
|
enum Cam
|
|
{
|
|
camera_unknown = 0,
|
|
camera_iiq,
|
|
camera_canon,
|
|
camera_end
|
|
};
|
|
|
|
template <typename num>
|
|
/*!
|
|
\brief
|
|
|
|
\fn clip
|
|
\param val
|
|
\return num
|
|
*/
|
|
num clip(float val) const
|
|
{
|
|
int vr = qRound(val);
|
|
|
|
// trust me I'm an engineer @ -2
|
|
// with -2 we do not get pink in oversaturated areas
|
|
if (vr > std::numeric_limits<num>::max())
|
|
vr = std::numeric_limits<num>::max()-2;
|
|
if (vr < 0)
|
|
vr = 0;
|
|
|
|
return static_cast<num>(vr);
|
|
}
|
|
|
|
template <typename num>
|
|
/*!
|
|
\brief
|
|
|
|
\fn clip
|
|
\param val
|
|
\return num
|
|
*/
|
|
num clip(double val) const
|
|
{
|
|
int vr = qRound(val);
|
|
|
|
// trust me I'm an engineer @ -2
|
|
// with -2 we do not get pink in oversaturated areas
|
|
if (vr > std::numeric_limits<num>::max())
|
|
vr = std::numeric_limits<num>::max()-2;
|
|
if (vr < 0)
|
|
vr = 0;
|
|
|
|
return static_cast<num>(vr);
|
|
}
|
|
|
|
template <typename num>
|
|
/*!
|
|
\brief
|
|
|
|
\fn clip
|
|
\param val
|
|
\return num
|
|
*/
|
|
num clip(int val) const
|
|
{
|
|
int vr = qRound(static_cast<double>(val));
|
|
|
|
// trust me I'm an engineer @ -2
|
|
// with -2 we do not get pink in oversaturated areas
|
|
if (vr > std::numeric_limits<num>::max())
|
|
vr = std::numeric_limits<num>::max()-2;
|
|
if (vr < 0)
|
|
vr = 0;
|
|
|
|
return static_cast<num>(vr);
|
|
}
|
|
|
|
private:
|
|
bool m_isChromatic; /*!< TODO: describe */
|
|
Cam m_camType; /*!< TODO: describe */
|
|
bool m_raw; /*!< TODO: describe */
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn loadRAW
|
|
\param fileName
|
|
\return bool
|
|
*/
|
|
bool loadRAW(const QString &fileName);
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn openBuffer
|
|
\param fileName
|
|
\param ba
|
|
\param iProcessor
|
|
\return bool
|
|
*/
|
|
bool openBuffer(const QString &fileName, const QSharedPointer<QByteArray>& ba, LibRaw& iProcessor);
|
|
/*!
|
|
\brief
|
|
|
|
\fn detectSpecialCamera
|
|
\param iProcessor
|
|
*/
|
|
void detectSpecialCamera(const LibRaw & iProcessor);
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn demosaic
|
|
\param iProcessor
|
|
\return cv::Mat
|
|
*/
|
|
cv::Mat demosaic(LibRaw & iProcessor);
|
|
/*!
|
|
\brief
|
|
|
|
\fn prepareImg
|
|
\param iProcessor
|
|
\return cv::Mat
|
|
*/
|
|
cv::Mat prepareImg(const LibRaw & iProcessor);
|
|
/*!
|
|
\brief
|
|
|
|
\fn whiteBalance
|
|
\param iProcessor
|
|
\param img
|
|
*/
|
|
void whiteBalance(const LibRaw & iProcessor, cv::Mat & img);
|
|
/*!
|
|
\brief
|
|
|
|
\fn whiteMultipliers
|
|
\param iProcessor
|
|
\return cv::Mat
|
|
*/
|
|
cv::Mat whiteMultipliers(const LibRaw & iProcessor);
|
|
/*!
|
|
\brief
|
|
|
|
\fn gammaCorrection
|
|
\param iProcessor
|
|
\param img
|
|
*/
|
|
void gammaCorrection(const LibRaw & iProcessor, cv::Mat& img);
|
|
/*!
|
|
\brief
|
|
|
|
\fn gammaTable
|
|
\param iProcessor
|
|
\return cv::Mat
|
|
*/
|
|
cv::Mat gammaTable(const LibRaw & iProcessor);
|
|
|
|
/*!
|
|
\brief
|
|
|
|
\fn raw2Img
|
|
\param iProcessor
|
|
\param img
|
|
\return QImage
|
|
*/
|
|
QImage raw2Img(const LibRaw & iProcessor, cv::Mat & img);
|
|
/*!
|
|
\brief
|
|
|
|
\fn mat2QImage
|
|
\param img
|
|
\return QImage
|
|
*/
|
|
QImage mat2QImage(cv::Mat img);
|
|
};
|
|
|
|
#endif // CIMAGE_H
|