在Qt中,可以对现有的图像进行处理,也可以对图形的显示进行设置。
一、设备无关、图像类——QImage:
特点:独立于具体硬件的图像类,主要用于读写图像文件,针对IO访问设计,并且能够在像素级别对图像进行处理。
我们先看一个实例:
左边是原图,右边是经过处理后的图像,首先对图形大小进行了改变,并且将所有的RGB颜色,全都转换为灰色。
实现代码如下:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QImage img;
if( img.load("test.jpg") )
{
img = img.scaled(QSize(img.width()/2, img.height()/2));
for(int i=0; i<img.width(); i++)
{
for(int j=0; j<img.height(); j++)
{
QRgb rgb = img.pixel(i, j);
int r = qRed(rgb);
int g = qGreen(rgb);
int b = qBlue(rgb);
int gray = (r + g + b) / 3;
img.setPixel(i, j, qRgb(gray, gray, gray));
}
}
img.save("new.jpg");
}
return a.exec();
}
通过这个例子,可以看到QIamge类对图像的处理。
在Qt中,还有一种是与设备相关的类——QPixmap,它依赖于具体的硬件,主要用于绘图,针对屏幕的显示而设计,显示效果依赖于所在平台的绘图引擎。
两个类之间的关系如下:
QPainter能够直接在图像上在绘制图形,而这两个类也可以相互转换。
功能简介:QImage用于读取图像文件,直接进行像素级的操作,其内置了简单图形的处理算法;
QPixmap可以最大限度地利用硬件(显卡)加速,增强图像显示效果,并且用于常用的截图功能:屏幕截图(grabWindow())、窗口截图(grabWidget())、组建截图等。
我们通过一个综合实验来对这两个类进行使用:
设置一个窗口,分别实现图像文件读取和截屏功能;
设计分析:两个按钮,一个文件打开对话框,QImage用于对读取到的图像进行显示,QPixmap实现对屏幕的截取。
头文件代码如下:
QPushButton m_loadBtn;
QPushButton m_grabBtn;
QPixmap m_pmap;
private slots:
void onLoadBtnClicked();
void onGrabBtnClicked();
protected:
void paintEvent(QPaintEvent *);
实现代码:
void Widget::onLoadBtnClicked()
{
QFileDialog fd(this);
fd.setAcceptMode(QFileDialog::AcceptOpen);
fd.setFileMode(QFileDialog::ExistingFile);
if( fd.exec() == QFileDialog::Accepted )
{
QImage img;
if( img.load(fd.selectedFiles()[0]) )
{
m_pmap = QPixmap::fromImage(img);
update();
}
else
{
QMessageBox(QMessageBox::Critical, "Error", "Invalid image file!").exec(); //直接调用构造函数生成一个临时对象
}
}
}
void Widget::onGrabBtnClicked()
{
m_pmap = QPixmap::grabWindow(QApplication::desktop()->winId());
update();
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter;
if( !m_pmap.isNull() )
{
painter.begin(this);
painter.drawPixmap(0, 0, width(), height(), m_pmap);
painter.end();
}
}
实现效果如下: