1 /***************************************************************************
2 conbridlg.h - Contrast/Brightness Dialog
4 begin : Fri Feb 6th 2004
5 copyright : (C) 2004 by Jasem Mutlaq
6 email : mutlaqja@ikarustech.com
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
17 ***************************************************************************/
20 #include <kimageeffect.h>
25 #include <qdatetime.h>
26 #include <knuminput.h>
30 #include "contrastbrightnessgui.h"
31 #include "conbridlg.h"
32 #include "fitsviewer.h"
33 #include "fitsimage.h"
37 //TODO find a better and faster way to implement this, this operation can be memory and CPU intensive.
39 ContrastBrightnessDlg::ContrastBrightnessDlg(QWidget
*parent
) :
40 KDialogBase(KDialogBase::Plain
, i18n( "Brightness/Contrast" ), Ok
|Cancel
, Ok
, parent
)
43 float pixdiff
, datadiff
;
44 contrast
= brightness
= 0;
45 viewer
= (FITSViewer
*) parent
;
46 displayImage
= viewer
->image
->displayImage
;
47 tempImage
= new QImage(displayImage
->copy());
48 width
= displayImage
->width();
49 height
= displayImage
->height();
52 pixdiff
= viewer
->stats
.max
- viewer
->stats
.min
;
53 offs
= - (viewer
->stats
.min
* datadiff
/ pixdiff
);
54 scale
= datadiff
/ pixdiff
;
56 ConBriDlg
= new ConBriForm(this);
57 if (!ConBriDlg
) return;
59 localImgBuffer
= (float *) malloc (width
* height
* sizeof(float));
62 kdDebug() << "Not enough memory for local image buffer" << endl
;
66 memcpy(localImgBuffer
, viewer
->imgBuffer
, width
* height
* sizeof(float));
68 setMainWidget(ConBriDlg
);
71 connect(ConBriDlg
->conSlider
, SIGNAL( valueChanged(int)), this, SLOT (setContrast(int )));
72 connect(ConBriDlg
->briSlider
, SIGNAL( valueChanged(int)), this, SLOT (setBrightness(int)));
76 ContrastBrightnessDlg::~ContrastBrightnessDlg()
81 void ContrastBrightnessDlg::range(int min
, int max
, int & num
)
83 if (num
< min
) num
= min
;
84 else if (num
> max
) num
= max
;
87 void ContrastBrightnessDlg::range(float min
, float max
, float & num
)
89 if (num
< min
) num
= min
;
90 else if (num
> max
) num
= max
;
96 void ContrastBrightnessDlg::setContrast(int contrastValue
)
98 int val
= 0, index
=0, totalPix
= width
* height
;
99 int min
= (int) viewer
->imgBuffer
[0], max
= 0;
102 contrast
= contrastValue
;
105 // Apply Contrast and brightness
106 for (int i
=0 ; i
< height
; i
++)
107 for (int j
=0; j
< width
; j
++)
109 val
= (int) *(viewer
->image
->templateImage
->scanLine(i
) + j
);
121 range(128, 255, val
);
126 myCol
.setRgb(val
,val
,val
);
127 if ( brightness
< 0 )
131 myCol
= myCol
.light(100+(brightness
));
138 localImgBuffer
[(height
- i
- 1) * width
+ j
] = (val
- offs
) / scale
;
143 for (int i
=0; i
< totalPix
; i
++)
145 if (localImgBuffer
[i
] < min
) min
= (int) localImgBuffer
[i
];
146 else if (localImgBuffer
[i
] > max
) max
= (int) localImgBuffer
[i
];
149 float pixdiff_b
= max
- min
;
150 float offs_b
= - (min
* 255 / pixdiff_b
);
151 float scale_b
= 255 / pixdiff_b
;
153 for (int i
=0; i
< height
; i
++)
154 for (int j
=0; j
< width
; j
++)
156 index
= i
* width
+ j
;
157 val
= (int) (localImgBuffer
[index
] * scale_b
+ offs_b
);
159 displayImage
->setPixel(j
, height
- i
- 1, val
);
162 viewer
->image
->zoomToCurrent();
165 void ContrastBrightnessDlg::setBrightness(int brightnessValue
)
167 int val
= 0, index
=0, totalPix
= width
* height
;
168 int min
= (int) viewer
->imgBuffer
[0], max
= 0;
171 brightness
= brightnessValue
;
173 // Apply Contrast and brightness
174 for (int i
=0 ; i
< height
; i
++)
175 for (int j
=0; j
< width
; j
++)
177 val
= (int) *(viewer
->image
->templateImage
->scanLine(i
) + j
);
189 range(128, 255, val
);
194 myCol
.setRgb(val
,val
,val
);
195 if ( brightness
< 0 )
199 myCol
= myCol
.light(100+(brightness
));
206 localImgBuffer
[(height
- i
- 1) * width
+ j
] = (val
- offs
) / scale
;
211 for (int i
=0; i
< totalPix
; i
++)
213 if (localImgBuffer
[i
] < min
) min
= (int) localImgBuffer
[i
];
214 else if (localImgBuffer
[i
] > max
) max
= (int) localImgBuffer
[i
];
217 float pixdiff_b
= max
- min
;
218 float offs_b
= - (min
* 255 / pixdiff_b
);
219 float scale_b
= 255 / pixdiff_b
;
221 for (int i
=0; i
< height
; i
++)
222 for (int j
=0; j
< width
; j
++)
224 index
= i
* width
+ j
;
225 val
= (int) (localImgBuffer
[index
] * scale_b
+ offs_b
);
227 displayImage
->setPixel(j
, height
- i
- 1, val
);
230 viewer
->image
->zoomToCurrent();
234 QSize
ContrastBrightnessDlg::sizeHint() const
236 return QSize(400,130);
239 #include "conbridlg.moc"