QLabel setPixmap, setScaledContents(true) Speicherverbrauch
Verfasst: 9. Juli 2007 18:24
Hallo,
ich muss einen Zoom für ein in einem QLabel anzuzeigendes jpeg-Bild implementieren und hab mich da an das imageviewer-Bsp aus dem examples-Verzeichnis von Qt gehalten.
Zunächst leite ich mein in einer QScrollArea anzuzeigendes Bild von QLabel ab:
Im Konstruktor von QPicture setze ich dann wie im imageviewer-Bsp. die SizePolicy und ScaledContents-Eigenschaft von QLabel:
In der öffentl. load()-Methode von QPicture wird dann das Bild geladen:
Bevor ich meine eigenen Zeichenoperationen im QLabel ausführe, rufe ich entspr. in der paintEvent()-Methode von QPicture die paintEvent()-Methode von QLabel auf:
In der Methode scaleImage() wird das Bild dann skaliert (entsprechend der MouseWheel-Bewegung mit Skalierungsfaktor factor):
Im Konstruktor von MainWindow, das von QMainWindow abgeleitet ist, wird die Scrollarea mit dem Label initialisiert:
Mein Problem nun: Beim Vergrössern/Verkleinern des jpeg-Bilds frisst das Programm jede Menge Speicher, selbst wenn ich nur ein kleines jpeg-Bild lade (~ 90 kB), belegt das Programm nach einigen Skalierungsstufen (Faktor 3-4) etwa 30 MB Speicher, größere jpeg-Bilder lassen sich gleich gar nicht mehr skalieren, ohne dass der Rechner in die Knie geht (512 MB RAM)
Gibt es irgendwelche Tricks beim Laden/Skalieren von jpeg-Bildern? Die Methode mit setPixmap() und resize() scheint auf jeden Fall nicht praktikabel zu sein für größere Bilder...
Danke für alle Hinweise,
AlGaN
P.S.: Die Klasse QPicture hat nichts mit der gleichnamigen Klasse von Qt zu tun, ich hab die Klasse nur zum besseren Verständnis umbenannt...
ich muss einen Zoom für ein in einem QLabel anzuzeigendes jpeg-Bild implementieren und hab mich da an das imageviewer-Bsp aus dem examples-Verzeichnis von Qt gehalten.
Zunächst leite ich mein in einer QScrollArea anzuzeigendes Bild von QLabel ab:
Code: Alles auswählen
class QPicture : public QLabel
{
Q_OBJECT
public:
QPicture(QWidget *parent = 0);
QPicture(const QString& filename, QWidget *parent = 0);
[...]
};
Code: Alles auswählen
QPicture::QPicture(QWidget *parent)
: QLabel(parent)
{
setMouseTracking(true);
setFocusPolicy(Qt::StrongFocus);
// QLabel init
setBackgroundRole(QPalette::Base);
setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
setScaledContents(true);
}
Code: Alles auswählen
bool QPicture::load(const QString& filename)
{
if (!filename.isEmpty()) {
QImage image(filename);
if (image.isNull()) {
qWarning("Cannot load '%s'", qPrintable(filename));
return false;
}
setPixmap(QPixmap::fromImage(image));
mScaleFactor = 1.0;
adjustSize();
update();
return true;
}
Code: Alles auswählen
void QPicture::paintEvent(QPaintEvent* e)
{
QLabel::paintEvent(e);
QPainter p(this);
refreshPixmap(&p); // draw path
}
Code: Alles auswählen
void QPicture::scaleImage(double factor)
{
if (!this->pixmap()) {
qDebug() << "No Pixmap loaded!";
return;
}
resize(factor * this->pixmap()->size());
}
Code: Alles auswählen
MainWindow::MainWindow()
: pic(0), scrollArea(0)
{
scrollArea = new QScrollArea;
scrollArea->setBackgroundRole(QPalette::Dark);
pic = new QPicture(scrollArea);
scrollArea->setWidget(pic);
setCentralWidget(scrollArea);
resize(800,600);
}
Gibt es irgendwelche Tricks beim Laden/Skalieren von jpeg-Bildern? Die Methode mit setPixmap() und resize() scheint auf jeden Fall nicht praktikabel zu sein für größere Bilder...
Danke für alle Hinweise,
AlGaN
P.S.: Die Klasse QPicture hat nichts mit der gleichnamigen Klasse von Qt zu tun, ich hab die Klasse nur zum besseren Verständnis umbenannt...