您现在的位置是:首页 >技术教程 >C++ + QT (不使用QT插件模式)的heic图片显示。网站首页技术教程

C++ + QT (不使用QT插件模式)的heic图片显示。

妹说零卡 2023-06-21 08:00:03
简介C++ + QT (不使用QT插件模式)的heic图片显示。

1.首先确定的是,要想C++读取或者显示heic图片。光用ffmpeg没有heic的解码器。所以此时就要用上libheif了。通过查资料发现,一个比较常见的 C++ 解析解码 heic 格式图片的开源库是 libheif,而这个库对 h265 的解码过程又依赖于另一个开源 C++ 库 libde265

同时从 github 上下载了这两个开源库。根据 github 上两个库 readme.md 的内容,依次编译通过 libde265 和 libheif ;

这里有简便方法。使用vcpkg来进行编译 如下步骤

1.git clone git@github.com:jakar/qt-heif-image-plugin.git

2.git clone https://github.com/microsoft/vcpkg

3..vcpkgootstrap-vcpkg.bat

4.

安装Libheif(以64位位列) 

指定安装(编译)64位库
> .vcpkgvcpkg install libheif:x64-windows
#指定安装(编译)32位库
> .vcpkgvcpkg install libheif:x86-windows
#默认安装32位
> .vcpkgvcpkg install libheif 

此步骤 安装和编译Libheif 会自动下载编译所需要的其他库。根据你需要的是x86还是x64的库自行选择。编译好后,就会生产如下

点击进去是这样的

此时libheif和libde265就自动编译好了。

打开VS新建一个C++或者QT工程。因为我这里需要使用QT显示hiec图片。

这里以x86工程展示。添加头文件和lib文件夹,如果是x64工程,则更改x86-window为x64-windows目录

 

 在将

这3个lib直接手动拖到左侧的代码结构树中。

添加如下代码

#include "libheif/heif.h"
#include "qdebug.h"
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    std::string filename = "C:/Users/Ys/Desktop/img/cheers_1440x960.heic";
    heif_context* heif_ctx_ = heif_context_alloc();
    if (!heif_ctx_) {
	    qDebug() << "!heif_ctx_";
    }
    heif_error error = heif_context_read_from_file(heif_ctx_, filename.c_str(), nullptr);
    if (error.code != heif_error_Ok) {
	    qDebug() << "heif_error_Ok";
    }
    heif_image_handle* heif_handle_ = nullptr;
    error = heif_context_get_primary_image_handle(heif_ctx_, &heif_handle_);
    if (error.code != heif_error_Ok) {
	    qDebug() << "heif_error_Ok";
    }
    int width_ = heif_image_handle_get_width(heif_handle_);
    int height_ = heif_image_handle_get_height(heif_handle_);

    heif_image* heif_img_ = nullptr;
    error = heif_decode_image(heif_handle_, &heif_img_, heif_colorspace_RGB, heif_chroma_interleaved_RGB, nullptr);
    if (error.code !=heif_error_Ok) {
	    qDebug() << "heif_error_Ok";
    }
    int stride;
    const uint8_t* data = heif_image_get_plane(heif_img_, heif_channel_interleaved, &stride);
//下面为使用QLabel进行展示的代码,其他图形框架根据框架要求 自行展示
    QImage img(data,width_,height_,QImage::Format_RGB888);
    ui.label->setPixmap(QPixmap::fromImage(img));
    


}

 最后将

这3个库 放到生成exe统计目录下即可。 

此文章使用的编译好的libheif库等其他库

https://download.csdn.net/download/qq_39501474/87738906

关于编译libheif可以查看Qt 支持HEIC/HEIF格式图片_安装libde265_妹说零卡的博客-CSDN博客

查看到如下位置,则可不用管下面的步骤了

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。