Commit 2959aae640147468d99615d51d244b424ab6d58f

Authored by David Mayerich
1 parent 5294a320

added support for large images

mainwindow.cpp
... ... @@ -20,7 +20,7 @@ void MainWindow::loadImage(QString fileName){
20 20 hsi.open(file, file + ".hdr");
21 21  
22 22 //initialize the size of the main window
23   - resize(hsi.header.samples+2, hsi.header.lines + ui->menuBar->size().height());
  23 + //resize(hsi.header.samples+2, hsi.header.lines + ui->menuBar->size().height());
24 24  
25 25 //fill the x axis with wavelength numbers from the hsi
26 26 x = QVector<double>::fromStdVector(hsi.header.wavelength);
... ... @@ -29,7 +29,7 @@ void MainWindow::loadImage(QString fileName){
29 29 load_band(x.size()/2);
30 30  
31 31 //set the pick position to the center of the image
32   - p = QPoint((int)(image.width()/2), (int)(image.height()/2));
  32 + px = py = 0.5;
33 33  
34 34 //create a graphics scene to store the image and any drawn UI elements
35 35 scene = new QGraphicsScene(this);
... ... @@ -45,6 +45,7 @@ void MainWindow::loadImage(QString fileName){
45 45 draw_viewport();
46 46 }
47 47  
  48 +
48 49 /// Update the image viewing widget so that it always fills the main window
49 50 void MainWindow::resizeEvent(QResizeEvent* event){
50 51  
... ... @@ -53,14 +54,32 @@ void MainWindow::resizeEvent(QResizeEvent* event){
53 54  
54 55 //get the current position of the QGraphicsView object
55 56 QPoint imagepos = ui->graphicsView->pos();
56   -
  57 +
  58 + //calculate the maximum allowable image width and height given the user's selected window size
  59 + unsigned int maxwidth = winsize.width() - imagepos.x();
  60 + unsigned int maxheight = winsize.height() - imagepos.y();
  61 +
  62 + //get the size of the image
  63 + QSize imagesize = image.size();
  64 +
  65 + //calculate the aspect ratio
  66 + //float aspect = imagesize.width() / imagesize.height();
  67 + float width_ratio = imagesize.width() / maxwidth;
  68 + float height_ratio = imagesize.height() / maxheight;
  69 +
  70 + //if the width requires the largest scaling
  71 + if(width_ratio >= height_ratio)
  72 + main_image = image.scaledToWidth(maxwidth);
  73 + else
  74 + main_image = image.scaledToHeight(maxheight);
  75 +
57 76 //update the size of the QGraphicsView object
58 77 // the QGraphicsView will be either the size of the image or
59 78 // the size of the window (whichever is smaller)
60   - QSize viewsize = QSize( std::min(winsize.width() - imagepos.x(), image.width()+2),
61   - std::min(winsize.height() - imagepos.y(), image.height()+2) );
  79 + QSize viewsize = QSize( main_image.width()+2, main_image.height()+2 );
62 80 ui->graphicsView->setFixedSize(viewsize.width(), viewsize.height());
63 81  
  82 + draw_viewport();
64 83 }
65 84  
66 85 /// Update everything associated with when the image is clicked
... ... @@ -70,13 +89,20 @@ void MainWindow::mousePressEvent(QMouseEvent * event){
70 89 QPoint winp = event->pos();
71 90  
72 91 //get the position of the QGraphicsView object (upper left corner of the image)
73   - QPoint imagep = ui->graphicsView->pos();
  92 + QPoint viewp = ui->graphicsView->pos();
74 93  
75 94 //get the size of the menu bar
76 95 int menu_height = ui->menuBar->size().height();
77 96  
78   - //calculate the position of the click in the image
79   - p = winp - imagep - QPoint(0, menu_height);
  97 + //calculate the position of the click in the graphics view
  98 + QPoint imagep = winp - viewp - QPoint(0, menu_height);
  99 +
  100 + //get the size of the graphics view object
  101 + QSize viewsize = ui->graphicsView->size();
  102 +
  103 + //calculate the position of the point in the image space [0, 1]
  104 + px = (float)imagep.x() / (float) viewsize.width();
  105 + py = (float)imagep.y() / (float) viewsize.height();
80 106  
81 107 //load the spectrum associated with p
82 108 load_spectrum();
... ... @@ -129,6 +155,16 @@ void MainWindow::load_band(unsigned int i){
129 155 QImage::Format_RGB888
130 156 )
131 157 );
  158 +
  159 + //get the main image size
  160 + QSize main_size = main_image.size();
  161 +
  162 + //scale the band image
  163 + main_image = image.scaledToHeight(main_size.height());
  164 +
  165 + //free the buffer and band memory
  166 + free(buffer);
  167 + free(band);
132 168 }
133 169  
134 170 void MainWindow::draw_viewport(){
... ... @@ -136,10 +172,10 @@ void MainWindow::draw_viewport(){
136 172 scene->clear();
137 173  
138 174 //add the image to the scene
139   - scene->addPixmap(image);
  175 + scene->addPixmap(main_image);
140 176  
141 177 //I'm not sure what this does...
142   - scene->setSceneRect(image.rect());
  178 + scene->setSceneRect(main_image.rect());
143 179  
144 180 //draw the overlay indicating the selected pixel
145 181 draw_overlay();
... ... @@ -154,8 +190,11 @@ void MainWindow::draw_overlay(){
154 190 //get the size of the QGraphicsView object
155 191 QSize image_size = ui->graphicsView->size();
156 192  
157   - scene->addLine(0, p.y(), image_size.width(), p.y());
158   - scene->addLine(p.x(), 0, p.x(), image_size.height());
  193 + //calculate the pixel position (index) into the main image
  194 + QPoint pi = QPoint(px * image_size.width(), py * image_size.height());
  195 +
  196 + scene->addLine(0, pi.y(), image_size.width(), pi.y());
  197 + scene->addLine(pi.x(), 0, pi.x(), image_size.height());
159 198 }
160 199  
161 200 /// Loads the spectrum from the picked point of the HSI and stores it in the member variable y
... ... @@ -164,8 +203,11 @@ void MainWindow::load_spectrum(){
164 203 //allocate the appropriate amount of memory for the spectrum
165 204 float* temp_y = (float*) malloc(x.size() * sizeof(float));
166 205  
  206 + //pixel position in the band image
  207 + QPoint pi = QPoint(px * image.width(), py * image.height());
  208 +
167 209 //load the spectrum from the HSI
168   - hsi.spectrum(temp_y, p.x(), p.y());
  210 + hsi.spectrum(temp_y, pi.x(), pi.y());
169 211  
170 212 //clear the previous spectrum
171 213 y.clear();
... ...
mainwindow.h
... ... @@ -33,8 +33,12 @@ private slots:
33 33 private:
34 34 Ui::MainWindow *ui;
35 35 QGraphicsScene* scene; //scene containing the image and any drawn UI elements
36   - QPixmap image; //stores the pixels for the displayed image
37   - QPoint p; //stores the picked position of the image
  36 + QPixmap image; //stores the pixels for the current band
  37 + QPixmap main_image; //stores the pixels for the image displayed in the main view (may be scaled)
  38 +
  39 + //coordinates of the picked position in image space [0, 1]
  40 + double px;
  41 + double py;
38 42  
39 43 SpectrumWindow* s; //window displaying the spectrum of the selected pixel
40 44  
... ...
mainwindow.ui
... ... @@ -6,8 +6,8 @@
6 6 <rect>
7 7 <x>0</x>
8 8 <y>0</y>
9   - <width>361</width>
10   - <height>377</height>
  9 + <width>780</width>
  10 + <height>733</height>
11 11 </rect>
12 12 </property>
13 13 <property name="windowTitle">
... ... @@ -19,8 +19,8 @@
19 19 <rect>
20 20 <x>0</x>
21 21 <y>0</y>
22   - <width>361</width>
23   - <height>331</height>
  22 + <width>781</width>
  23 + <height>701</height>
24 24 </rect>
25 25 </property>
26 26 <property name="alignment">
... ... @@ -33,8 +33,8 @@
33 33 <rect>
34 34 <x>0</x>
35 35 <y>0</y>
36   - <width>361</width>
37   - <height>21</height>
  36 + <width>780</width>
  37 + <height>31</height>
38 38 </rect>
39 39 </property>
40 40 <widget class="QMenu" name="menuFile">
... ...
spectrumplot.cpp deleted
spectrumplot.h deleted
1   -/*#ifndef SPECTRUMPLOT_H
2   -#define SPECTRUMPLOT_H
3   -
4   -#include "qcustomplot.h"
5   -
6   -//stim libraries
7   -#include "stim/envi/envi.h"
8   -
9   -namespace Ui {
10   -class MainWindow;
11   -}
12   -
13   -class SpectrumPlot : public QCustomPlot
14   -{
15   - Q_OBJECT
16   -
17   -public:
18   - //explicit MainWindow(QWidget *parent = 0);
19   - //~MainWindow();
20   -
21   - //void mousePressEvent(QMouseEvent* event); //handles when the image is clicked
22   - //void resizeEvent(QResizeEvent* event); //handles when the window is resized
23   -
24   -private:
25   - //Ui::MainWindow *ui;
26   - //QGraphicsScene* scene; //scene containing the image and any drawn UI elements
27   - //QPixmap image; //stores the pixels for the displayed image
28   - //QPoint p; //stores the picked position of the image
29   -
30   - //SpectrumWindow* s; //window displaying the spectrum of the selected pixel
31   -
32   - //stim::envi hsi; //data structure storing the current hyperspectral image
33   - //QVector<double> x; //x values for the spectrum
34   - //QVector<double> y; //y values for the spectrum
35   -
36   - //void draw_overlay(); //draws an overlay showing the picked position
37   - //void draw_viewport(); //draws the viewport, including the image and overlay
38   - //void load_spectrum(); //loads a spectrum from the HSI and stores it in the global variable y
39   - //void draw_spectrum(); //sends a spectrum to the SpectrumWindow for plotting
40   -
41   -};
42   -
43   -#endif // SPECTRUMPLOT_H*/
spectrumwindow.cpp
... ... @@ -8,7 +8,16 @@ SpectrumWindow::SpectrumWindow(QWidget *parent) :
8 8 ui(new Ui::SpectrumWindow)
9 9 {
10 10 ui->setupUi(this);
  11 +
  12 + //install an event filter to detect user clicks
11 13 ui->spectrumPlot->installEventFilter(this);
  14 +
  15 + //create a line for the current band
  16 + bandline = new QCPItemStraightLine(ui->spectrumPlot);
  17 + ui->spectrumPlot->addItem(bandline);
  18 +
  19 +
  20 +
12 21 }
13 22  
14 23 SpectrumWindow::~SpectrumWindow()
... ... @@ -25,10 +34,15 @@ void SpectrumWindow::plotSpectrum(QVector&lt;double&gt; x, QVector&lt;double&gt; y){
25 34 if(y[i] < y_min) y_min = y[i];
26 35 if(y[i] > y_max) y_max = y[i];
27 36 }
  37 +
  38 + //set the range of the y axis to the minimum and maximum spectrum values
28 39 ui->spectrumPlot->yAxis->setRange(y_min, y_max);
29 40  
  41 + //add the graph to the plot
30 42 ui->spectrumPlot->addGraph();
31 43 ui->spectrumPlot->graph(0)->setData(x, y);
  44 +
  45 + //redraw the plot
32 46 ui->spectrumPlot->replot();
33 47 }
34 48  
... ... @@ -39,6 +53,15 @@ void SpectrumWindow::initPlot(double x_min, double x_max, double y_min, double y
39 53 // set axes ranges, so we see all data:
40 54 ui->spectrumPlot->xAxis->setRange(x_min, x_max);
41 55 ui->spectrumPlot->yAxis->setRange(y_min, y_max);
  56 +
  57 + //set the initial position of the band line
  58 + double xmid = (x_max + x_min) / 2;
  59 + std::cout<<"xmid: "<<xmid<<std::endl;
  60 + bandline->point1->setCoords(xmid, 0);
  61 + bandline->point2->setCoords(xmid, 1);
  62 + bandline->setPen(QPen(Qt::red));
  63 +
  64 +
42 65 ui->spectrumPlot->replot();
43 66 }
44 67  
... ... @@ -54,6 +77,7 @@ void SpectrumWindow::resizeEvent(QResizeEvent* event){
54 77  
55 78 bool SpectrumWindow::eventFilter(QObject *target, QEvent *event)
56 79 {
  80 +
57 81 if(target == ui->spectrumPlot && event->type() == QEvent::MouseMove)
58 82 {
59 83 QMouseEvent *_mouseEvent = static_cast<QMouseEvent*>(event);
... ... @@ -65,6 +89,10 @@ bool SpectrumWindow::eventFilter(QObject *target, QEvent *event)
65 89 //calculate the position of the click in the image
66 90 double x = ui->spectrumPlot->xAxis->pixelToCoord(pixel.x());
67 91 double y = ui->spectrumPlot->yAxis->pixelToCoord(pixel.y());
  92 +
  93 + //set the position of the band line
  94 + bandline->point1->setCoords(x, 0);
  95 + bandline->point2->setCoords(x, 1);
68 96 }
69 97 else if(target == ui->spectrumPlot && event->type() == QEvent::MouseButtonPress)
70 98 {
... ... @@ -80,21 +108,13 @@ bool SpectrumWindow::eventFilter(QObject *target, QEvent *event)
80 108  
81 109 //tell the parent MainWindow that a point on the spectrum was selected
82 110 ((MainWindow*)parent())->mousePressSpectrum(x, y);
  111 +
  112 + //set the position of the band line
  113 + bandline->point1->setCoords(x, 0);
  114 + bandline->point2->setCoords(x, 1);
83 115 }
84   - return false;
85   -}
86 116  
87   -/// Update everything associated with when the image is clicked
88   -void SpectrumWindow::mousePressEvent(QMouseEvent * event){
89 117  
90   - //get the window position of the click
91   - QPoint winp = event->pos();
92   -
93   -
94   - //calculate the position of the click in the image
95   - QPoint p = winp;
96   -
97   - //output the image position
98   - std::cout<<p.x()<<" "<<p.y()<<std::endl;
99 118  
  119 + return false;
100 120 }
... ...
spectrumwindow.h
... ... @@ -4,6 +4,7 @@
4 4 #include <QDialog>
5 5 #include <QVector>
6 6 #include <iostream>
  7 +#include "qcustomplot.h"
7 8  
8 9 namespace Ui {
9 10 class SpectrumWindow;
... ... @@ -22,10 +23,12 @@ public:
22 23  
23 24 void resizeEvent(QResizeEvent* event); //handles when the window is resized
24 25 bool SpectrumWindow::eventFilter(QObject *target, QEvent *event);
25   - void mousePressEvent(QMouseEvent* event); //handles when the image is clicked
26 26  
27 27 private:
28 28 Ui::SpectrumWindow *ui;
  29 +
  30 + //line that displays the currently selected band
  31 + QCPItemStraightLine* bandline;
29 32 };
30 33  
31 34 #endif // SPECTRUMWINDOW_H
... ...
win32/Qt5Core.dll
No preview for this file type
win32/Qt5PrintSupport.dll
No preview for this file type
win32/Qt5QuickWidgets.dll 0 → 100644
No preview for this file type
win32/hsiview.exe
No preview for this file type
win32/platforms/qwindows.dll
No preview for this file type