You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/conbridlg.cpp

240 lines
6.1 KiB

/***************************************************************************
conbridlg.h - Contrast/Brightness Dialog
-------------------
begin : Fri Feb 6th 2004
copyright : (C) 2004 by Jasem Mutlaq
email : mutlaqja@ikarustech.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* *
***************************************************************************/
#include <tdelocale.h>
#include <kimageeffect.h>
#include <kdebug.h>
#include <tqslider.h>
#include <tqimage.h>
#include <tqdatetime.h>
#include <knuminput.h>
#include <stdlib.h>
#include "contrastbrightnessgui.h"
#include "conbridlg.h"
#include "fitsviewer.h"
#include "fitsimage.h"
#define REFRESH 500
//TODO find a better and faster way to implement this, this operation can be memory and CPU intensive.
ContrastBrightnessDlg::ContrastBrightnessDlg(TQWidget *parent) :
KDialogBase(KDialogBase::Plain, i18n( "Brightness/Contrast" ), Ok|Cancel, Ok, parent )
{
float pixdiff, datadiff;
contrast = brightness = 0;
viewer = (FITSViewer *) parent;
displayImage = viewer->image->displayImage;
tempImage = new TQImage(displayImage->copy());
width = displayImage->width();
height = displayImage->height();
datadiff = 255;
pixdiff = viewer->stats.max - viewer->stats.min;
offs = - (viewer->stats.min * datadiff / pixdiff);
scale = datadiff / pixdiff;
ConBriDlg = new ConBriForm(this);
if (!ConBriDlg) return;
localImgBuffer = (float *) malloc (width * height * sizeof(float));
if (!localImgBuffer)
{
kdDebug() << "Not enough memory for local image buffer" << endl;
return;
}
memcpy(localImgBuffer, viewer->imgBuffer, width * height * sizeof(float));
setMainWidget(ConBriDlg);
show();
connect(ConBriDlg->conSlider, TQT_SIGNAL( valueChanged(int)), this, TQT_SLOT (setContrast(int )));
connect(ConBriDlg->briSlider, TQT_SIGNAL( valueChanged(int)), this, TQT_SLOT (setBrightness(int)));
}
ContrastBrightnessDlg::~ContrastBrightnessDlg()
{
delete (tempImage);
}
void ContrastBrightnessDlg::range(int min, int max, int & num)
{
if (num < min) num = min;
else if (num > max) num = max;
}
void ContrastBrightnessDlg::range(float min, float max, float & num)
{
if (num < min) num = min;
else if (num > max) num = max;
}
#include <math.h>
void ContrastBrightnessDlg::setContrast(int contrastValue)
{
int val = 0, index=0, totalPix = width * height;
int min = (int) viewer->imgBuffer[0], max = 0;
if (!viewer) return;
TQColor myCol;
contrast = contrastValue;
// Apply Contrast and brightness
for (int i=0 ; i < height ; i++)
for (int j=0; j < width; j++)
{
val = (int) *(viewer->image->templateImage->scanLine(i) + j);
if (contrast)
{
if (val < 128)
{
val -= contrast;
range(0, 127, val);
}
else
{
val += contrast;
range(128, 255, val);
}
}
if (brightness)
{
myCol.setRgb(val,val,val);
if ( brightness < 0 )
val += brightness;
else
{
myCol = myCol.light(100+(brightness));
val = myCol.red();
}
range(0, 255, val);
}
localImgBuffer[(height - i - 1) * width + j] = (val - offs) / scale;
}
for (int i=0; i < totalPix; i++)
{
if (localImgBuffer[i] < min) min = (int) localImgBuffer[i];
else if (localImgBuffer[i] > max) max = (int) localImgBuffer[i];
}
float pixdiff_b = max - min;
float offs_b = - (min * 255 / pixdiff_b);
float scale_b = 255 / pixdiff_b;
for (int i=0; i < height; i++)
for (int j=0; j < width; j++)
{
index = i * width + j;
val = (int) (localImgBuffer[index] * scale_b + offs_b);
range(0, 255, val);
displayImage->setPixel(j, height - i - 1, val);
}
viewer->image->zoomToCurrent();
}
void ContrastBrightnessDlg::setBrightness(int brightnessValue)
{
int val = 0, index=0, totalPix = width * height;
int min = (int) viewer->imgBuffer[0], max = 0;
if (!viewer) return;
TQColor myCol;
brightness = brightnessValue;
// Apply Contrast and brightness
for (int i=0 ; i < height ; i++)
for (int j=0; j < width; j++)
{
val = (int) *(viewer->image->templateImage->scanLine(i) + j);
if (contrast)
{
if (val < 128)
{
val -= contrast;
range(0, 127, val);
}
else
{
val += contrast;
range(128, 255, val);
}
}
if (brightness)
{
myCol.setRgb(val,val,val);
if ( brightness < 0 )
val += brightness;
else
{
myCol = myCol.light(100+(brightness));
val = myCol.red();
}
range(0, 255, val);
}
localImgBuffer[(height - i - 1) * width + j] = (val - offs) / scale;
}
for (int i=0; i < totalPix; i++)
{
if (localImgBuffer[i] < min) min = (int) localImgBuffer[i];
else if (localImgBuffer[i] > max) max = (int) localImgBuffer[i];
}
float pixdiff_b = max - min;
float offs_b = - (min * 255 / pixdiff_b);
float scale_b = 255 / pixdiff_b;
for (int i=0; i < height; i++)
for (int j=0; j < width; j++)
{
index = i * width + j;
val = (int) (localImgBuffer[index] * scale_b + offs_b);
range(0, 255, val);
displayImage->setPixel(j, height - i - 1, val);
}
viewer->image->zoomToCurrent();
}
TQSize ContrastBrightnessDlg::sizeHint() const
{
return TQSize(400,130);
}
#include "conbridlg.moc"