Manipulação de Imagens no Qt: Exibição e Operações Básicas

O framework Qt oferece suporte para manipulação de imagens através das classes QImage e QPixmap. É possível exibir imagens, realizar operações de redimensionamento e rotação utilizando os métodos disponíveis nessas classes.

1. Formatos de Imagem Suportados

Conforme documentação oficial do Qt, os formatos que podem ser lidos e exibidos diretamente são: BMP, GIF, JPG, JPEG, PNG, TIFF, PBM, PGM, PPM, XBM e XPM.

2. Exibição de Imagens no Qt

Para exibir imagens, utiliza-se comumente o widget QLabel combinado com o método setPixmap(). Outra alternativa é emplear a classe QPainter para desenhar diretamente na superfície do componente.

Quando a imagem possui dimensões maiores que o espaço disponível no QLabel, recomenda-se incorporar o componente dentro de um QScrollArea. Essa abordagem permite implementar barras de rolagem horizontais e verticais, garantindo que toda a imagem seja visível ao usuário.

3. Implementação da Exibição de Imagens

O processo para carregar e exibir uma imagem segue estas etapas: primeiramente, abrir o arquivo de imagem; em seguida, carregar os dados em um objeto QImage; posteriormente, converter para QPixmap; finalmente, atribuir ao QLabel através do método setPixmap().

Exemplo de implementação:

    QString caminhoArquivo;
    caminhoArquivo = QFileDialog::getOpenFileName(this,
                                                   tr("Selecionar Imagem"),
                                                   "",
                                                   tr("Imagens (*.png *.bmp *.jpg *.jpeg *.tif *.gif)"));
    if (caminhoArquivo.isEmpty())
    {
        return;
    }

    QImage* imagem = new QImage;
    if (!(imagem->load(caminhoArquivo)))
    {
        QMessageBox::critical(this,
                              tr("Erro"),
                              tr("Falha ao carregar a imagem!"));
        delete imagem;
        return;
    }
    ui->rotuloImagem->setPixmap(QPixmap::fromImage(*imagem));

Observação: Também é possível utilizar diretamente QPixmap com o método load(). A diferença fundamental entre QImage e QPixmap reside na forma de manipulação: QImage oferece acesso aos pixels individuais e utiliza renderização independente do hardware, enquanto QPixmap emprega o sistema de绘图 da plataforma subjacente, proporcionando melhor desempenho para exibição na tela.

4. Redimensionamento de Imagens

O redimensionamento é realizado através do método scaled(). Assinatura do método:

QImage QImage::scaled(const QSize& tamanho, Qt::AspectRatioMode modoProporcao = Qt::IgnoreAspectRatio, Qt::TransformationMode modoTransformacao = Qt::FastTransformation) const

Exemplo prático de redimensionamento:

QImage* imagemRedimensionada = new QImage;
*imagemRedimensionada = imagem->scaled(novaLargura,
                                        novaAltura,
                                        Qt::KeepAspectRatio);
ui->rotuloImagem->setPixmap(QPixmap::fromImage(*imagemRedimensionada));

Os parâmetros novaLargura e novaAltura definem as dimensões desejadas para a imagem após o redimensionamento.

5. Rotação de Imagens

A rotação de imagens utiliza o método transformed(), que recebe uma matriz de transformação QTransform. O objeto de transformação especifica o ângulo de rotação desejado.

Implementação:

QImage* imagemRotacionada = new QImage;
QTransform matriz;
matriz.rotate(270);
*imagemRotacionada = imagem->transformed(matriz);
ui->rotuloImagem->setPixmap(QPixmap::fromImage(*imagemRotacionada));

Importante: O ângulo especificado no método rotate() representa rotação no sentido horário. O exemplo acima Rotaciona 270 graus no sentido horário, equivalent a 90 graus no sentido anti-horário.

6. Redimensionamento Contínuo com Slider

Para implementar redimensionamento dinâmico, utiliza-se o componente QSlider. O valor retornado pelo slider permite calcular o fator de escala aplicado à imagem original.

Expressão de dimensionamento:

img->scaled(larguraOriginal * valorSlider / 100, alturaOriginal * valorSlider / 100, Qt::KeepAspectRatio);

Os valores larguraOriginal e alturaOriginal correspondem às dimensões da imagem carregada inicialmente.

Observação: O redimensionamento contínuo pode ser implementado conectando o sinal valueChanged() do QSlider a um slot que executa o redimensionamento da imagem conforme o valor atual do controle.

Tags: Qt qimage qpixmap qlabel imagem

Publicado em 6-4 06:35 por Thomas