ich arbeite gerade an einer Klasse zur Darstellung von Bild-Histogrammen.
Dazu habe ich erst mal eine Klasse von QWidget abgeleitet, und erstelle dann ein Qlabel und ein QImage. Wenn es neue Daten gibt, die angezeigt werden sollen, rufe ich setBins auf.
Da setBins nicht aus dem Hauptthread des Programms aufgerufen wird, habe ich außerdem die Methode repaintDisplay() implementiert. Und an der Codestelle wo ich setBins aufrufe, emite ich ein Signal, dass an einen Slot gekettet ist, der dann auf dem Richtigen Histogram repaintDisplay() aufruft.
Mein Problem ist jetzt allerdings, dass mein Histogram nicht angezeigt wird.
Nach Studen langem googlen bin ich zu dem Ergebnis gekommen, dass ich mir vermutlich bei der Berechnung des Images irgendwie das Image-Objekt invalidiere, und das Label deshalb nicht angezeigt wird.
Die Methode, in der ich den Fehler vermute wäre dann calculateHistogramMono()
Ach ja, mir ist klar, dass das Histogram auf dem Kopf stehen wird. Aber das zu ändern stellt dann auch kein Problem mehr da, wenn dann endlich mal eins angezeigt wird.
Ich verwende VisualStudio 2010 und QT 4.8
Hier mein Code:
ImageHistogram.h:
Code: Alles auswählen
#ifndef IMAGEHISTOGRAM_H
#define IMAGEHISTOGRAM_H
#include <qwidget.h>
#include <qlabel.h>
class ImageHistogram : public QWidget
{
public:
ImageHistogram(QWidget *Parent);
~ImageHistogram();
void setBins(int *bins, int numBins);
void repaintDisplay();
private:
void initImage();
void calculateHistogramMono(int *bins);
void calculateHistogramRGB(int *bins);
int getArrayMaximum(int *Array, int length);
int getArrayMinimum(int *Array, int length);
QLabel *Display;
QImage *Data;
};
#endif
Code: Alles auswählen
#include "ImageHistogram.h"
#include <qboxlayout.h>
#include <limits>
ImageHistogram::ImageHistogram(QWidget *Parent):QWidget(Parent)
{
QHBoxLayout *TopLvlLayout = new QHBoxLayout(this);
Display = new QLabel(this);
TopLvlLayout->addWidget(Display);
setLayout(TopLvlLayout);
initImage();
}
ImageHistogram::~ImageHistogram()
{
}
void ImageHistogram::initImage()
{
Data = new QImage(255, 100, QImage::Format_Indexed8);
auto value = qRgb(255, 255, 255);
Data->setColor(0, value);
value = qRgb(255, 0, 0);
Data->setColor(1, value);
value = qRgb(0, 255, 0);
Data->setColor(2, value);
value = qRgb(0, 0, 255);
Data->setColor(3, value);
value = qRgb(30, 30, 30);
Data->setColor(4, value);
Data->fill(qRgb(255, 255, 255));
Display->setPixmap(QPixmap::fromImage(*Data));
//Display->update();
}
void ImageHistogram::setBins(int *bins, int numBins)
{
if(numBins < 3 * 255)
calculateHistogramMono(bins);
else
calculateHistogramRGB(bins);
}
void ImageHistogram::calculateHistogramMono(int *bins)
{
int maxVal = getArrayMaximum(bins, 255);
float mult = 100.0 / maxVal;//zum normalisieren auf 100
for(int i = 0;i < 255; i++)
{
int y = bins[i] * mult;
for(int k = 0; k < y; k++)
Data->setPixel(i, k, 4);
for(int k = y; k < 100; k++)
Data->setPixel(i, k, 0);
}
Display->setPixmap(QPixmap::fromImage(*Data));
}
void ImageHistogram::calculateHistogramRGB(int *bins)
{
}
int ImageHistogram::getArrayMaximum(int *Array, int length)
{
int max = 0;
for(int i = 0; i < length; i++)
if(Array[i] > max)
max = Array[i];
return max;
}
int ImageHistogram::getArrayMinimum(int *Array, int length)
{
int min = std::numeric_limits<int>::max();
for(int i = 0; i < length; Array++)
if(*Array < min)
min = *Array;
return min;
}
void ImageHistogram::repaintDisplay()
{
Display->setPixmap(QPixmap::fromImage(*Data));
Display->repaint();
}