Home / Programmazione / C - C++ / Ridimensionare immagini in Qt
Mattepuffo

Ridimensionare immagini in Qt

Ridimensionare immagini in Qt

Oggi vi propongo una semplice classe Qt per il ridimensionamento delle immagini.

Questa classe la uso praticamente tutti i giorni in un programma che mi sono creato per lavoro.

E' molto easy, e consiste di un solo metodo statico.

Per il ridimensionamento, seguendo il consiglio del forum HTML.it, ho usato QImage e non QPixmap; qui potete trovare una spiegazione.

Questo il file di intestazione:

// imageresize.h
#ifndef IMAGERESIZI_H
#define IMAGERESIZI_H
 
#include
#include
#include
#include
 
class ImageResize
{
public:
    virtual ~ImageResize();
    static void resize(QString inputImage, QString dir, int width, int height);
};
 
#endif // IMAGERESIZI_H

Il metodo resize richiede 4 parametri:

  • l'immagine di iniziale
  • la directory dove salvare le immagini
  • la largezza
  • l'altezza

Questo il file di implementazione:

// imageresize.m
#include "imageresize.h"
 
void ImageResize::resize(QString inputImage, QString dir, int width, int height)
{
    QFileInfo f(inputImage);
    QImage pixmap(inputImage);
    QImage newPixmap;
    if (width == 0)
    {
        newPixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation);
    }
    else if (height == 0)
    {
        newPixmap = pixmap.scaledToWidth(width, Qt::SmoothTransformation);
    }
    else
    {
        newPixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    }
    QFile file(dir + f.fileName());
    file.open(QIODevice::WriteOnly);
    newPixmap.save(&file, 0, 100);
    file.close();
}
 
ImageResize::~ImageResize()
{
}

Gli if servono per questo:

  • se sono indicate entrambe le dimensioni, l'immagine viene settata seguendo quelle (metodo scaled)
  • se viene indicata solo larghezza e altezza=0, l'altezza viene calcolata automaticamente (scaledToWidth)
  • se viene indicata solo l'altezza e larghezza=0, la larghezza viene calcolata automaticamente (scaledToHeight)

Fate un pò di prove per capire le differenze.

Enjoy!