0
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <stdio.h>
#include <iostream>
#include <QDialog>
#include <opencv2\video\video.hpp>
#include <opencv2\opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/flann/miniflann.hpp"
#include <QLabel>
#include <QScrollArea>
#include <QScrollBar>
cv::Mat image1;
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
image1 = cv::imread("D:\\picture.jpg");
QImage       qimage1((uchar*)image1.data,image1.cols,image1.rows,image1.step,QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(qimage1));
}

MainWindow::~MainWindow()
{
delete ui;
}

我有尺寸为 720*1280 的图片。我想在尺寸为 600*600 的标签中显示这张图片。但是,它只显示了图片的一部分。所以我的问题是如何在不改变图片大小的情况下显示整个图片。

4

1 回答 1

3

您可以使用函数,请参阅此处QPixmap::scaled()的文档和此处的示例

在你的情况下,它会是这样的:

ui->label->setPixmap(QPixmap::fromImage(qimage1).scaled(QSize(600,600), Qt::KeepAspectRatio));

它不会影响图像本身,它会从图像构建 QPixmap,将其缩放以适合您的 600x600 Qlabel 并保持纵横比。希望这会帮助你。顺便说一句,您不需要使用 OpenCV 来读取图像,在 QtQImage类中可以仅使用 QString path_to_image 构造 QImage:QImage myImg("D:\\picture.jpg");

已编辑(抱歉耽搁了):

要添加 QScrollArea,您必须在构造函数中创建它(假设您的主窗口中只有 QLabel 和 QScrollArea),如下所示:

// constructor, right after ui->setupUi(this);
QScrollArea *scroll=new QScrollArea(this); // creating instance of QScrollarea with mainwindow as it's parent
scroll->setWidget(ui->label); // sets widget, that you want to have scrollbars
this->setCentralWidget(scroll); // sets scrollarea as centralwidget
于 2013-06-01T18:53:21.140 回答