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.