heic(HEIF)格式图像处理(三)

创建场景

创建一个场景作为显示图像的画框,在Qt里使用QGraphicsView、QGraphicsScene等进行绘制场景显示图像。

创建一个类PixItem继承于QGraphicsItem然后实现重绘、滚轮、鼠标拖放等功能,主要用于加载解析好的heic格式图像,然后对图像进行一些操作,比如放大、缩小、鼠标拖放等功能。下面是具体实现的类。

class PixItem : public QGraphicsItem //继承自图元类
{
public:
    PixItem(QPixmap pixmap);  //构造函数初始化了变量pix
    QRectF boundingRect() const;   //实现自己的boundingRect
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); //重绘
    void wheelEvent(QGraphicsSceneWheelEvent *event);
    void setZoomState(const int &zoomState);

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

    int getScaleValue() const;
    void setScaleValue(const int &);

private:
    qreal m_scaleValue;   //缩放值
    QPixmap pix;    //作为图元显示的图片
    int m_zoomState;

    bool m_isMove;
    QPointF m_startPos;

    FileDialogEx *m_fileDialogEx;
};

通过重绘图像,重写鼠标点击事件、移动事件、释放等事件,来对图像进行控制,需要注意的是需要在构造函数中加入:setAcceptDrops(true);实现图像拖拽的前提。

然后对每个函数进行实现:

(1)实现图像的边界函数

QRectF PixItem::boundingRect() const
{
    return QRectF(-pix.width() / 2, -pix.height() / 2,
                  pix.width(), pix.height());
}

(2)将图元图片绘出

void PixItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
                    QWidget *)
{
    painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);
}

这样的话,图像就可以显示出来了,主要是需要在paint函数中实现drawPixmap函数。但是想要对图像进一步操作,还需要继续实现头文件中定义的其他函数,我们一个一个来看。

(3)对图像进行局部缩放

图像的局部缩放主要用到了setScale函数,它可以控制图像的大小:

//鼠标点击事件  局部缩放
void PixItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    m_startPos = event->pos();
    m_isMove = true;

    int scaleValue = m_scaleValue;
    if(m_zoomState == ZOOM_IN)       //局部放大
    {
        scaleValue++;
    }
    else if(m_zoomState == ZOOM_OUT)        //局部缩小
    {
        scaleValue--;
    }

    if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES)
        return;

    if (m_scaleValue != scaleValue)
    {
        setTransformOriginPoint(event->pos().x(), event->pos().y());
    }
    m_scaleValue = scaleValue;
    qreal s;
    //实现局部缩放
    if(m_scaleValue > 0)
    {
        s = pow(1.1, m_scaleValue);        //放大 计算x的y方次 参数都是double类型
    }else
    {
        s = pow(1 / 1.1, -m_scaleValue);      //缩小
    }
    setScale(s);
}

(4)鼠标的移动事件

void PixItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(m_isMove)
    {
        QPointF point = event->pos() - m_startPos;
        moveBy(point.x(), point.y());

    }

}

void PixItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{
    m_isMove = false;
}

上述画布类实现完成后,就可以作为显示图像的画布了。主要实现显示图像、当滑动鼠标是图像放大缩小,然后通过鼠标左键进行拖拽实现图像的移动。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 你可以使用图像处理软件或在线工具将PNG图片转换为HEIF格式。步骤如下: 1. 打开图像处理软件,例如Adobe Photoshop。 2. 选择要转换的PNG图片,然后点击“文件”菜单中的“保存为”选项。 3. 选择HEIF格式,并确保选择了正确的参数(例如图像质量)。 4. 按照提示保存文件即可。 如果您不想使用图像处理软件,也可以使用在线工具将PNG图片转换为HEIF格式。您可以搜索“在线PNG到HEIF转换器”,找到合适的工具,并按照提示上传和转换您的图像即可。 ### 回答2: 将PNG图片转换为HEIF格式可以通过以下步骤进行: 1. 下载并安装图像转换工具:你需要下载并安装一个支持转换HEIF格式的图像转换工具,比如XnConvert、Adobe Photoshop等。 2. 打开图像转换工具:运行图像转换工具并选择打开PNG图像文件。 3. 设置输出格式HEIF:在图像转换工具中,找到输出格式选项,选择HEIF作为输出格式。 4. 调整图像参数(可选):你可以根据需要调整一些图像参数,如图像质量、分辨率等。这些参数根据不同的图像转换工具可能会略有不同。 5. 开始转换:点击开始转换或保存按钮,开始将PNG图像转换为HEIF格式。这个过程可能需要一些时间,具体取决于你的图像大小和计算机性能。 6. 保存HEIF图像:在转换完成后,选择保存HEIF图像到你指定的目录。 注意事项: - 在转换PNG图像为HEIF格式时,一些图像细节可能会发生变化,所以最好在转换后进行一次检查,确保图像质量符合预期。 - 某些图像转换工具可能需要付费购买才能支持HEIF格式的转换,所以在选择转换工具时要注意。 ### 回答3: 将PNG图片转换为HEIF格式有多种方法,以下是一种常用的方法: 首先,你可以从互联网上下载一个专门的软件来进行转换。一些可用的软件包括HEIC Converter、iMazing HEIC Converter等。下载并安装软件后,打开软件界面。 然后,将你想要转换的PNG图片拖拽到软件的界面上,或者点击软件界面上的添加图像按钮选择图片。 接下来,设置输出选项。这些选项通常包括选择输出文件夹、重命名输出文件、调整压缩质量等。根据你的需求进行选择和调整。 最后,点击开始转换按钮开始转换过程。等待软件将PNG图片转换为HEIF格式,转换时间取决于图片的大小和软件的性能。 转换完成后,你可以在输出文件夹中找到转换后的HEIF格式图片。你可以使用任何支持HEIF格式的设备或软件来打开和查看这些图片。 需要注意的是,HEIF格式图片相对于PNG格式图片,可以更有效地压缩图像,减小文件大小。此外,不是所有的设备和软件都支持HEIF格式,因此,在使用HEIF格式时需要确保其兼容性与可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫手的热山药

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值