Files
core/ASCImageStudio3/AVSImageRaw3/trunk/workingcopy/ImageRawOptions.h

408 lines
12 KiB
C++

/*! \file ImageRawOptions.h
* \brief Íàñòðîéêè raw-êîíâåðòåðà
*
* \author Nikolay.Pogorskiy@avsmedia.net
* \details
* Ïðèìåð XML:
*
* <ImageRaw3 mode="0">
* <SimpleMode ver="1">
* <CameraWhiteBalance use="0"/>
* <AutoWhiteBalance use="0">
* <AverageGrayBox use="0">
* <X max="0">0</X>
* <Y max="0">0</Y>
* <W max="0">0</W>
* <H max="0">0</H>
* </AverageGrayBox>
* <CustomWhiteBalance use="0">
* <R min="0" max="0">0.0</R>
* <G1 min="0" max="0">0.0</G1>
* <B min="0" max="0">0.0</B>
* <G2 min="0" max="0">0.0</G2>
* </CustomWhiteBalance>
* <PresetWhiteBalance use="0" max="8">0</PresetWhiteBalance>
* <Temperature use="0">
* <TemperatureValue min="0" max="0"></TemperatureValue>
* <Green min="0" max="0"></Green>
* </Temperature>
* <CameraMatrix use="0"/>
* <CorrectChromaticAberration use="0">
* <R min="0" max="0">0.0</R>
* <B min="0" max="0">0.0</B>
* </CorrectChromaticAberration>
* <DarknessLevel use="0" min="0" max="0">-1</DarknessLevel>
* <SaturationLevel use="0" min="0" max="0">-1</SaturationLevel>
* <DenoisingThreshold use="0" max="0.0">0.0</DenoisingThreshold>
* <HighlightMode use="0" max="8">0</HighlightMode>
* <NoAutoBrighten use="0"/>
* <AdjustBrightness use="0" min="0" max="0">1.0</AdjustBrightness>
* <InterpolationQuality use="0" max="3">3</InterpolationQuality>
* <MedianFilterPasses use="0" max="0">0</MedianFilterPasses>
* </SimpleMode>
* </ImageRaw3>
*
*/
#pragma once
#include "stdio.h"
#include "XMLWrapper.h"
#include "comutil.h"
#define IMAGERAW_MAX_CHANNEL_MUL 9.0
#define IMAGERAW_MIN_CHANNEL_MUL 1.0
/*!
* \brief Âñïîìîãàòåëüíàÿ ôóíêöèÿ äëÿ óñòàíîâêè çíà÷åíèÿ àòðèáóòà XML-óçëà
*/
/*template <class T>
void SetAttrib(XML::XMLNodeWrapper & node,BSTR name,T value)
{
VARIANT variant;
variant.vt = VT_BSTR;
variant.bstrVal = _bstr_t(value).copy();
node.SetAttributeValue(name,variant);
::SysFreeString(variant.bstrVal);
}*/
//#include "atlcomcli.h"
/*!
* \brief Íàñòðîéêè äëÿ ðåæèìà "simple"
*
* \details Êëàññ äëÿ õðàíåíèÿ íàñòðîåê è îáåñòïå÷åíèÿ çàãðóçêè è ñîõðàíåíèÿ â xml
*/
class ImageRaw3SimpleModeOptions
{
public:
/*!
* \brief Ïîëüçîâàòåëüñêèå çíà÷åíèÿ áàëàíñà áåëîãî
*/
struct SCustomWhiteBalance
{
float r,g1,b,g2;
float max_r,max_g1,max_b,max_g2;
float min_r,min_g1,min_b,min_g2;
SCustomWhiteBalance(float r_=0.0,float g1_=0.0,float b_=0.0,float g2_=0.0):r(r_),g1(g1_),b(b_),g2(g2_)
{
max_r = 9.0; max_g1 = 9.0; max_g2 = 9.0; max_b = 9.0;
min_r = 1.0; min_g1 = 1.0; min_g2 = 1.0; min_b = 1.0;
};
void Reset()
{
max_r = 9.0; max_g1 = 9.0; max_g2 = 9.0; max_b = 9.0;
min_r = 1.0; min_g1 = 1.0; min_g2 = 1.0; min_b = 1.0;
r = g1 = b = g2 = 0.0;
}
};
/*!
* \brief Ãðàíèöû ñåðîé îáëàñòè äëÿ óñòàíîâêè áàëàíñà áåëîãî
*/
struct SAverageGrayBox
{
int x,y,w,h;
int max_x,max_y,max_w,max_h;
SAverageGrayBox(int x_ =0, int max_x_ =0
,int y_=0, int max_y_ =0
,int w_=0, int max_w_ =0
,int h_=0, int max_h_ =0)
:x(x_),y(y_),w(w_),h(h_),max_x(max_x_),max_y(max_y_),max_w(max_w_),max_h(max_h_)
{
};
void Reset()
{
x = y = w = h = 0;
max_x = max_y = max_w = max_h = 0;
}
};
/*!
* \brief Çíà÷åíèÿ äëÿ êîððåêöèè õðîìàòè÷åñêèõ àáåððàöèé
*/
struct SCorrectChromaticAberration
{
float r,b;
float min_r,min_b;
float max_r,max_b;
SCorrectChromaticAberration(float r_=0.0,float min_r_ =0.0,float max_r_ =0.0, float b_=0.0, float min_b_ = 0.0, float max_b_ = 0.0):
r(r_),b(b_),max_r(max_r_),max_b(max_b_),min_r(min_r_),min_b(min_b_)
{
}
void Reset()
{
r = b = 0.0;
min_r = 0.0;
max_r = 0.0;
min_b = 0.0;
max_b = 0.0;
}
};
/*!
* \brief Ïîëüçîâàòåëüñêèå çíà÷åíèÿ öâåòîâîé òåìïåðàòóðû è óðîâíÿ çåëåíîãî
*/
struct STemperature
{
float temperature;
float green;
float max_temperature,min_temperature;
float max_green,min_green;
STemperature(float temperature_,float green_):temperature(temperature_),green(green_)
{
max_temperature = 15000;
min_temperature = 2000;
max_green = 2.5;
min_green = 0.2;
};
void Reset()
{
temperature = 0;
green = 0.0;
max_temperature = 15000;
min_temperature = 2000;
max_green = 2.5;
min_green = 0.2;
}
};
int Version; //!< Âåðñèÿ íàñòðîåê
bool UseCameraWhiteBalance; //!< Áàëàíñ áåëîãî êàìåðû
bool UseAutoWhiteBalance; //!< Àâòîìàòè÷åñêèé áàëàíñ áåëîãî
bool UseAverageGrayBox; //!< Èñïîëüçîâàíèÿ ñåðîé îáëàñòè äëÿ óñòàíîâêè áàëàíñà áåëîãî
SAverageGrayBox AverageGrayBox; //!< Ñåðàÿ îáëàñòü äëÿ óñòàíîâêè áàëàíñà áåëîãî
bool UseCustomWhiteBalance; //!< Èñïîëüçîâàíèå ïîëüçîâàòåëüñêèõ çíà÷åíèÿ äëÿ óñòàíîâêè áàëàíñà áåëîãî
SCustomWhiteBalance CustomWhiteBalance; //!< Ïîëüçîâàòåëüñêèå çíà÷åíèÿ áàëàíñà áåëîãî
bool UsePresetWhiteBalance; //!< Èñïîëüçîâàíèå ïðåäóñòàíîâëåííûõ íàñòðîåê áàëàíñà áåëîãî
int PresetWhiteBalance; //!< Ïðåäóñòàíîâëåííûå íàñòðîéêè áàëàíñà áåëîãî
int max_PresetWhiteBalance; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà PresetWhiteBalance
bool UseTemperature; //!< Èñïîëüçîâàíèå ïîëüçîâàòåëüñêèõ çíà÷åíèé öâåòîâîé òåìïåðàòóðû è óðîâíÿ çåëåíîãî
STemperature Temperature; //!< Ïîëüçîâàòåëüñêèå çíà÷åíèÿ öâåòîâîé òåìïåðàòóðû è óðîâíÿ çåëåíîãî
bool UseCameraMatrix; //!< use camera matrix
bool UseCorrectChromaticAberration; //!< Êîððåêöèÿ õðîìàòè÷åñêèõ àáåððàöèé
SCorrectChromaticAberration CorrectChromaticAberration; //!< Çíà÷åíèÿ äëÿ êîððåêöèè õðîìàòè÷åñêèõ àáåððàöèé
bool UseDarknessLevel; //!< Óñòàíîâêà óðîâíÿ ÷åðíîãî
int DarknessLevel; //!< Çíà÷åíèå óðîâíÿ ÷åðíîãî
int max_DarknessLevel; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà
int min_DarknessLevel; //!< Ìèíèìàëüíîå çíà÷åíèå ïàðàìåòðà
bool UseSaturationLevel; //!< Óñòàíîâêà óðîâíÿ íàñûùåííîñòè
int SaturationLevel; //!< Óðîâåíü íàñûùåííîñòè
int max_SaturationLevel; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà \a SaturationLevel
int min_SaturationLevel; //!< Ìèíèìàëüíîå çíà÷åíèå ïàðàìåòðà \a SaturationLevel
bool UseDenoisingThreshold; //!< Èñïîëüçîâàíèå ïîäàâëåíèÿ øóìîâ
float DenoisingThreshold; //!< Çíà÷åíèå ïîðîãà äëÿ ïîäàâëåíèÿ øóìîâ
float max_DenoisingThreshold; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà \a DenoisingThreshold
bool UseHighlightMode; //!< Îáðàáîòêà ïåðåñâå÷åííûõ îáëàñòåé
int HighlightMode; //!< Ðåæèì îáðàáîòêè ïåðåñâå÷åííûõ îáëàñòåé
int min_HighlightMode; //!< Ìèíèìàëüíîå çíà÷åíèå ïàðàìåòðà HighlightMode
int max_HighlightMode; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà HighlightMode
bool NoAutoBrighten; //!< no auto brighten
bool UseAdjustBrightness; //!< Óñòàíîâêà ïàðàìåòðà ÿðêîñòè
float AdjustBrightness; //!< Çíà÷åíèå ïàðàìåòðà ÿðêîñòè
float min_AdjustBrightness; //!< Ìèíèìàëüíîå çíà÷åíèå ïàðàìåòðà \a AdjustBrightness
float max_AdjustBrightness; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà \a AdjustBrightness
bool UseInterpolationQuality; //!< Èñïîëüçîâàíèå ïàðàìåòðà ðåæèìà èíòåðïîëÿöèè
int InterpolationQuality; //!< Ðåæèì èíòåðïîëÿöèè
int max_InterpolationQuality; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà \a InterpolationQuality
bool UseMedianFilterPasses; //!< Èñïîëüçîâàíèå ìåäèàííîãî ôèëüòðà
int MedianFilterPasses; //!< ×èñëî ïðîõîäîâ ìåäèàííîãî ôèëüòðà
int max_MedianFilterPasses; //!< Ìàêñèìàëüíîå çíà÷åíèå ïàðàìåòðà \a MedianFilterPasses
public:
//! Êîíñòðóêòîð êëàññà
ImageRaw3SimpleModeOptions():
Version(1),
UseCameraWhiteBalance(false),
UseAutoWhiteBalance(false),
UseAverageGrayBox(false),
AverageGrayBox(0,0,0,0),
UseCustomWhiteBalance(false),
CustomWhiteBalance(0.0,0.0,0.0,0.0),
UsePresetWhiteBalance(false),
PresetWhiteBalance(0),
max_PresetWhiteBalance(0),
UseTemperature(false),
Temperature(0,0.0),
UseCameraMatrix(false),
UseCorrectChromaticAberration(false),
CorrectChromaticAberration(0.0,0.0),
UseDarknessLevel(false),
min_DarknessLevel(0),
max_DarknessLevel(0),
DarknessLevel(-1),
UseSaturationLevel(false),
min_SaturationLevel(0),
max_SaturationLevel(0),
SaturationLevel(-1),
UseDenoisingThreshold(false),
DenoisingThreshold(0.0),
max_DenoisingThreshold(0.0),
UseHighlightMode(false),
max_HighlightMode(0),
min_HighlightMode(0),
HighlightMode(0),
NoAutoBrighten(false),
UseAdjustBrightness(false),
min_AdjustBrightness(0.0),
max_AdjustBrightness(0.0),
AdjustBrightness(1.0),
UseInterpolationQuality(false),
max_InterpolationQuality(3),
InterpolationQuality(3),
UseMedianFilterPasses(false),
max_MedianFilterPasses(0),
MedianFilterPasses(0)
{
}
//! Ñáðîñ âñåõ ïàðàìåòðîâ íà çíà÷åíèÿ ïî óìîë÷àíèþ
void Reset()
{
Version = 1;
UseCameraWhiteBalance = false;
UseAutoWhiteBalance = false;
UseAverageGrayBox = false;
AverageGrayBox.Reset();
UseCustomWhiteBalance = false;
CustomWhiteBalance.Reset();
UsePresetWhiteBalance = false;
PresetWhiteBalance = 0;
max_PresetWhiteBalance = 0;
UseTemperature = false;
Temperature.Reset();
UseCameraMatrix = false;
UseCorrectChromaticAberration = false;
CorrectChromaticAberration.Reset();
UseDarknessLevel = false;
max_DarknessLevel = 0;
min_DarknessLevel = 0;
DarknessLevel = -1;
UseSaturationLevel = false;
SaturationLevel = -1;
max_SaturationLevel = 0;
min_SaturationLevel = 0;
UseDenoisingThreshold = false;
max_DenoisingThreshold = 0.0;
DenoisingThreshold = 0.0;
UseHighlightMode = false;
max_HighlightMode = 0;
max_HighlightMode = 0;
HighlightMode = 0;
NoAutoBrighten = false;
UseAdjustBrightness = false;
AdjustBrightness = 1.0;
max_AdjustBrightness = 0.0;
min_AdjustBrightness = 0.0;
UseInterpolationQuality = false;
InterpolationQuality = 3;
UseMedianFilterPasses = false;
MedianFilterPasses = 0;
}
//! Ñêîïèðîâàòü XML ñ ïàðàìåòðàìè â ñòðîêó BSTR
HRESULT CopyXMLTo(BSTR * xml)
{
HRESULT hr;
XML::XMLDocumentWrapper xmlDoc;
if (!xml)
return E_POINTER;
*xml = NULL;
if FAILED(hr = SetXMLDoc(xmlDoc))
return hr;
if (!(xmlDoc.GetXML(xml)))
return E_FAIL;
return S_OK;
}
//! Çàãðóçèòü ïàðàìåòðû èç ñòðîêè, ñîäåðæàùåé xml
HRESULT OpenXML(BSTR xml)
{
if (!xml)
return E_POINTER;
XML::XMLDocumentWrapper xmlDoc;
if (!xmlDoc.LoadXML(xml))
return E_INVALIDARG;
return ParseXMLDoc(xmlDoc);
}
//! Çàãðóçèòü ïàðàìåòðû èç XML-ôàéëà
HRESULT OpenFile(BSTR filename)
{
HRESULT hr;
if (!filename)
return E_POINTER;
XML::XMLDocumentWrapper xmlDoc;
BSTR bsFileName = ::SysAllocString(filename);
if (!xmlDoc.Load(bsFileName))
hr = E_INVALIDARG;
else
hr = S_OK;
::SysFreeString(bsFileName);
if FAILED(hr)
return hr;
return ParseXMLDoc(xmlDoc);
}
//! Ñîõðàíèòü ïàðàìåòðû â XML-ôàéë
HRESULT SaveFile(BSTR filename)
{
HRESULT hr;
XML::XMLDocumentWrapper xmlDoc;
if (!filename)
return E_POINTER;
if FAILED(hr = SetXMLDoc(xmlDoc))
return hr;
BSTR bsFileName = ::SysAllocString(filename);
if (!(xmlDoc.Save(bsFileName)))
hr = E_FAIL;
else
hr = S_OK;
::SysFreeString(bsFileName);
return hr;
}
protected:
//! Ïðåîáðàçîâàòü ïàðàìåòðû â ñòðóêòóðó XML::XMLDocumentWrappe
HRESULT SetXMLDoc(XML::XMLDocumentWrapper & xmlDoc);
//! Çàïîëíèòü ïîëÿ êëàññà èç ñòðóêòóðû XML::XMLDocumentWrapper
HRESULT ParseXMLDoc(XML::XMLDocumentWrapper & xmlDoc);
};