Qt图像显示及裁剪

  • Post author:
  • Post category:其他


介绍

最近做了一个长图分割的小工具(

GitHub

),记录一下用到的两个类

QImage



QPixmap

还有控件QLabel以及ScrollArea。

Qt provides four classes for handling image data:

QImage

,

QPixmap

,

QBitmap

and

QPicture

.

QImage

is designed and optimized for I/O, and for direct pixel access and manipulation, while

QPixmap

is designed and optimized for showing images on screen.

QBitmap

is only a convenience class that inherits

QPixmap

, ensuring a depth of 1. Finally, the

QPicture

class is a paint device that records and replays

QPainter

commands.

大概是说image可以进行io交互,其提供了直接通过文件路径进行读写图片的方法,也可以对图像做修改,像素级的。pixmap用于在屏幕显示。bitmap是pixmap子类,显示单色深度图。picture是个类似于画板的东西,可以记录和重放painter的操作,painter就是个画笔了。

Qt图像显示

这里只说基本的显示,通过QLabel可以显示图片,其提供了setPixmap方法可。

首先用QFileDialog::getOpenFileName获取图像文件路径,传递给QImage,通过load方法读入图像。

然后QLabel::setPixmap(QPixmap::fromImage(image))实现吧image转换成pixmap并在label显示。

此时有个问题:label可能显示不全图片,那就需要控件ScrollArea来协作。

直接在designer中拖入ScrollArea控件,然后将label拖到ScrollArea中,并且给ScrollArea增加任意一种layout即可,此时显示图像如果大于了label原始尺寸则会出现滚动条可以通过拖拽滚动条实现整个图片的显示。

layout有默认的边框尺寸,可以修改layoutleftmargin、layouttopmargin、layoutrightmargin、layoutbottommargin等改为0,这样label和ScrollArea的尺寸就完全相同了

其他

用户点击图片位置确定

void PictureLabel::mousePressEvent(QMouseEvent *ev) {
    if(ev->button() == Qt::RightButton) {
        emit SegmentationPostion(ev->pos());
    }
    QLabel::mousePressEvent(ev);
}

重写label的mousePressEvent方法,判断按键类型即可,上面判断的是右键则发出当前鼠标位置的信号

图片分割

在QImage中利用copy方法可以直接分割图片,方法需要传入左上角坐标和长宽,传入后返回原图像指定长方形区域的图片,不会修改原图。

Techie亮博客,转载请注明:

Coologic

»

Qt图像显示及裁剪


Coologic 博客

域名已更改,已从 www.techieliang.com 改为

www.coologic.cn

,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。



版权声明:本文为coologic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。