Qt 支持HEIC/HEIF格式图片

2023-11-18

HEIF 格式简介(源于百度知道)

heic的格式是苹果针对iOS11专门研发的一个照片格式。Heic是Apple iOS和macOS的文件格式,用于处理图像和视频。Heic是IOS 11系统中取代原始视频和照片的H.264和JEP格式。Heic格式不仅可以节省内存,还可以保留原始图像质量。Heic格式是Apple iOS和macOS的专用格式
与JPG相比,它占用的空间更小,画质更加无损。HEIC格式照片支持iOS11及macOS High Sierra(10.13)及更新版本。但是此种格式是无法在Windows 中直接使用看图软件打开的(Windows10 RS4开始支持该格式)。

HEIF和HEIC的关系?

HEIF 是图片格式,HEVC (HEVC 是编码格式(比如 H.264,H.265))进行编码的 HEIF 图片就是后缀为 .heic 的图片

Qt 支持HEIF插件编译

首先声明,Qt官方并未支持heic格式图片,但已经有大神基于libheif库做了Qt的插件,本文只是帮住大家解决如何编译该Heif插件

  • 插件github地址
  • 编译依赖:Cmake、libheif (≥ version 1.1)、Qt 5 (Core and GUI modules)

官方文档说编译依赖的是cmake、pkg-config(个人不了解,如果有大神请指点)是不准确的,容易产生误导,真实的依赖是Qt+libheif并且通过Cmake进行构建工程

下载编译qt-heif-image-plugin

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

首先我们直接编译会报错
在这里插入图片描述
这里本质就是我们找不到pkg-config的库,所以我们需要先解决编译环境配置问题

配置构建环境

Libheif地址
安装Libheif,github的readme中已经清楚说明了"Libheif is included in Vcpkg.",该库已经被包含在Vcpkg中,为了简化我们还需要自己编译Libheif,我们直接使用Vcpkg 进行安装Libheif

下载并安装vcpkg
 > git clone https://github.com/microsoft/vcpkg

在这里插入图片描述

> .\vcpkg\bootstrap-vcpkg.bat

在这里插入图片描述

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

Libheif 编译过程中需要的依赖会自动下载(一下子简单起来)
在这里插入图片描述编译安装之后,输出
在这里插入图片描述

安装pkg-config

由于后续会修改Cmake文件,后续并未真正用到pkg-config,此步骤可以忽略,尽量跟着做

./vcpkg install pkgconf:x64-windows

在这里插入图片描述

如何让Cmake 知道我们安装的vcpkg库?
  • cmake要用vcpkg下载的库
  • 设置DCMAKE_TOOLCHAIN_FILE

“-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake”

我的目录是E:\Git\vcpkg

E:\Git\vcpkg\downloads\tools\cmake-3.22.2-windows\cmake-3.22.2-windows-i386\bin\cmake -B ./build_2019 -G "Visual Studio 16 2019" -A x64 -S . "-DCMAKE_TOOLCHAIN_FILE=E:\\Git\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake"

构建

如果下载了pkg-config可以直接构建成功,否则需要先修改Cmake文件,才可以构建VS工程
在这里插入图片描述
修改Cmake

cmake_minimum_required(VERSION 3.5)  # lowest version tried
#新增加===
#DEBUG增加后缀
set(CMAKE_DEBUG_POSTFIX "d")
set(LIBHEIF_PATH E:\\Git\\vcpkg\\installed\\x64-windows)
###此处路径添加你自己的
set(LIBHEIF_INC_DIR ${LIBHEIF_PATH}\\include)
set(LIBHEIF_LIB_DIR ${LIBHEIF_PATH}\\lib)
#设置附加头文件
include_directories(${LIBHEIF_INC_DIR})
#设置附加库目录
link_directories(${LIBHEIF_LIB_DIR})
#新增加===

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# make release build, if not specified
# (from https://blog.kitware.com/cmake-and-the-default-build-type/)
set(default_build_type "RelWithDebInfo")

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Build type" FORCE)
  set_property(
    CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
    "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif ()

# compiler flags
# TODO: separate GCC and Clang warnings; add more
#修改==
set(
  CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \
  -Wall \
  ")
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og")
#修改===

set(sanitizer_flags "-fsanitize=address -fsanitize=undefined")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${sanitizer_flags}")
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG
    "${CMAKE_MODULE_LINKER_FLAGS_DEBUG} ${sanitizer_flags}")

#
# third-party libs
#

# qt
find_package(Qt5 COMPONENTS Core Gui REQUIRED)
add_definitions(-DQT_NO_KEYWORDS)
set(CMAKE_AUTOMOC ON)

# libheif
#修改==
#find_package(PkgConfig)
#pkg_check_modules(libheif REQUIRED libheif>=1.1)

set (LIB_HEIF heif libx265 libde265) 
#修改==
#
# project source
#

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(sources main.cpp qheifhandler.cpp)


add_library(qheif MODULE ${sources})
#修改==
target_link_libraries(
  qheif
  PRIVATE
  Qt5::Gui
  ${LIB_HEIF}
)
#修改==

#
# installation
#

# Use qmake to find plugin dir (adapted from lxqt-qtplugin)
get_target_property(
  QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION)

if (NOT QT_QMAKE_EXECUTABLE)
  message(FATAL_ERROR "qmake is not found.")
endif ()

execute_process(
  COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS
  OUTPUT_VARIABLE QT_PLUGINS_DIR
  OUTPUT_STRIP_TRAILING_WHITESPACE)

if (QT_PLUGINS_DIR)
  message(STATUS "Qt5 plugin directory: " "${QT_PLUGINS_DIR}")
else ()
  message(FATAL_ERROR "Qt5 plugin directory cannot be detected.")
endif ()

# Prefix with DESTDIR if available to allow packaging
if (ENV{DESTDIR} AND NOT ENV{DESTDIR} STREQUAL "")
  set(plugins_dir "$ENV{DESTDIR}${QT_PLUGINS_DIR}")
else ()
  set(plugins_dir "${QT_PLUGINS_DIR}")
endif ()

install(
  TARGETS qheif
  LIBRARY DESTINATION "${plugins_dir}/imageformats")

# vim:sw=2 

验证

  • VS直接打开Demo工程
  • 修改例子源码
#include <QApplication>
#include <QDebug>
#include <QImage>
#include<QImageReader>
#include <QLabel>
const QString path="E:\\Git\\qt-heif-image-plugin\\bird_burst.heic";
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //输出支持的图片
    qDebug()<<QImageReader::supportedImageFormats();
    const QString imgPath(path);
    QImage image(imgPath);
    if (!image.isNull()) {
        qDebug() << "image size:" << image.size();
        QLabel* label = new QLabel();
        int w = 0;
        int h = 0;
        if (image.width() > image.height()) {
            w = 1400;
            h = (1.0 * image.height()) / (1.0 * image.width() * 1400);
        } else {
            h = 1400;
            w = (1.0 * 1400 * image.height()) /(1.0 * image.width());
        }
        qDebug() << w << h;
        const QPixmap pixmap = QPixmap::fromImage(image);
        label->setPixmap(pixmap);
        label->show();
        label->resize(image.size());
     } else {
           qCritical() << "Invalid image:" << imgPath;
    }

    return a.exec();
}

  • 编译
  • 使用windeployqt打包exe

windeployqt qtheif.exe

  • 把qheif.dll拷贝到程序运行目录的imageformats下

  • 把heif.dll、libde265.dll、libx265.dll拷贝到程序运行目录的根目录
    在这里插入图片描述

  • 运行程序,图片既可加载显示出来
    在这里插入图片描述
    参考文献
    vcpkg 快速入门
    HEIF&HEIC

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 支持HEIC/HEIF格式图片 的相关文章

  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • 如何在qt中进行异步文件io?

    我想知道如何在qt中实现异步文件io 这在普通的 qt 中是否可以实现 或者有人需要使用另一个库 例如 libuv 来实现这样的事情 我正在查看 QDataStream 但即使它是一个 流 它也不是非阻塞的 我想一种解决方案是制作一个在内部
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 在哪里可以找到 QT 5.3.0 命令提示符

    用于学习Qt的书 C gui programming with qt 4 2nd 版 我需要Qt的命令提示符 我已经安装了Qt 5 3 0 creator 5 3 0开源 但不知道它的命令提示符在哪里 有人可以帮助我吗 我认为您正在寻找的是
  • 无法将 QList 分配给 QString

    我遇到这个错误 Unable to assign QList
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • 是否有 Qt 小部件可以浏览应用程序中小部件的层次结构(类似于 Spy++)?

    我们有一个具有复杂的小部件层次结构的应用程序 我希望能够以与 Spy 类似的方式浏览此层次结构 查看和编辑属性 例如大小 如果有一个小部件可以显示此信息 则它不需要在外部应用程序中运行 那么问题来了 这样的神兽存在吗 您可以使用Gammar
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A

随机推荐

  • Log4j学习笔记

    用了三四年的C 转向Java的怀抱 还是有诸多的不适应 C 中不论多复杂的Server 只要有GDB在手 总感觉debug都不是啥大事 程序运行期间的各种状态 都可以通过GDB轻松的获取到 而到了Java中 总感觉像是被困住了手脚 有力没法
  • 【JavaScript】npm、Yarn 和 pnpm 的区别

    npm Yarn 和 pnpm 都是用于管理和构建 JavaScript 项目的包管理工具 以下是它们之间的一些区别和特点 npm Node Package Manager npm 是 Node js 官方提供的包管理工具 是 JavaSc
  • 什么是数据中心IP,优缺点是什么?

    如果根据拥有者或者说发送地址来分类的话 可以将代理分为三类 数据中心ip 住宅ip 移动ip 本文我们来了解数据中心ip的原理以及他们的优势劣势 才能选择适合自己的代理 一 什么是数据中心ip代理 数据中心ip是由数据中心拥有和管理的IP的
  • Air780E

    目录 基础资料 探讨重点 实现功能 硬件准备 软件版本 在雁飞格物平台上创建产品 1 创建产品 2 查看雁飞格物平台接入协议 组成ClientId 组成userName 3 设备鉴权信息 鉴权参数计算 python版 4 MQTT直连雁飞格
  • 目标检测之选择性搜索算法实现(符动图演示)

    定义 选择性搜索是在对象检测中使用的区域提议算法 它的设计速度很快 召回率很高 它基于基于颜色 纹理 大小和形状兼容性的相似区域的分层分组计算 操作步骤 首先使用 Felzenszwalb 和 Huttenlocher 基于图像的分割方法
  • clouddrive挂载阿里云盘之后文件不显示

    clouddrive挂载阿里云盘之后文件不显示 此问题是小概率版本bug 待更新后解决 目前解决方案 重新挂载登录刷新
  • R手册(Visualise)--GGally(ggplot2 extensions)

    本站已停止更新 查看最新内容请移至本人博客 Wilen s Blog 文章目录 GGally ggmatrix ggplot2矩阵 ggpairs ggplot2广义配对图 ggscatmat 纯粹定量变量的传统散点图矩阵 返回ggplot
  • canvas绘制并导出图片(画笔)

    绘制 var canvas document getElementById myCanvas canvas width document getElementById drawLine offsetWidth canvas height d
  • HTML中的& nbsp; & ensp; & emsp;等6种空格标记

    代码 1 2 3 4 5 6
  • 【工作笔记】web项目从Spring3.x升级到Spring4.x

    Spring3 x升级到Spring4 x Spring升级首先到https docs spring io spring framework docs官方文档查看Spring各个版本的信息 比较不同 确定要升级的版本和要改动的地方 从官网可
  • 【第01例】IPD进阶

    目录 简介 专栏目录 内容详解 作者简介 相关课程 简介 今天来讲讲 IPD 中涉及的几个评审点 先来看一下 CDCP CDCP 是英文 Concept Decision Check Point 首字母的简称 也就是概念决策评审点 具体讲解
  • 解决:com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure(真实有效)

    数据库连接失败 在数据库连接失败 经常会有蛮多一系列的问题导致的原因 这个时候一定要多去尝试一下各种方法 并且做好自己的梳理 一 例如我在SpringBoot项目中使用了阿里的数据库连接池Driud 有次在启动的时候 会报这样的错 Caus
  • if 与elif

    if condition1 代码段1 if condition2 代码段2 else 代码段3 执行顺序 gt 进入if condition1 condition1 为true gt 执行 代码段1 gt 进入 if condition2
  • JVM工具-jstack

    jstack 打印线程堆栈信息 支持支持本地java进程 core文件以及远程java进程 命令格式 jstack options pid jstack options executable core jstack options serv
  • Mac电脑硬件/软件运行状况查看工具

    iStat Menus是一款系统监控和管理工具 旨在帮助Mac用户实时监控电脑的各项硬件和软件信息 它以直观和定制化的方式提供了丰富的系统状态指标 让用户能够全面了解和管理自己的Mac电脑 iStat Menus提供了一系列的菜单栏指示项目
  • iphone文件访问ftp服务器,ipad ftp服务器 iPhone/iPad访问FTP服务器设置步骤

    ipad ftp服务器 iPhone iPad访问FTP服务器设置步骤 2013 02 27 15 35 39 脚本之家 有时候出门在外需要用到电脑中的文件 但是却没有携带电脑或者U盘 那么该怎么办呢 其实在IOS系统上 一些实用的应用软件
  • 云计算基础-基本概念(一)

    云计算基本概念 一 一 网络 1 VPC 虚拟专有网络 2 LB 负载均衡 3 vFW 虚拟防火墙 4 TOR 5 Region 6 AZ 可用区 7 Overlay和Underlay 8 VPC对等连接 9 BGW 10 NAT Gate
  • MySQL 8.0 修改密码 步骤详解(详细图解)

    1 以管理员身份打开cmd窗口 定位到MySQL安装目录下的bin目录 输入net stop mysql 回车 关闭MySQL数据库 2 输入mysqld console skip grant tables shared memory my
  • Python 爬虫进阶必备

    今日网站 aHR0cHM6Ly93d3cuemRheWUuY29tL0ZyZWVJUExpc3QuaHRtbA 这个网站来自咸鱼的技术交流群 抓包分析与加密定位 这个网站是某代理商的免费代理页面 我们想要实现的就是这个页面上免费代理的提取
  • Qt 支持HEIC/HEIF格式图片

    HEIF 格式简介 源于百度知道 heic的格式是苹果针对iOS11专门研发的一个照片格式 Heic是Apple iOS和macOS的文件格式 用于处理图像和视频 Heic是IOS 11系统中取代原始视频和照片的H 264和JEP格式 He