当前位置:网站首页>Qt 支持HEIC/HEIF格式图片
Qt 支持HEIC/HEIF格式图片
2022-08-01 09:58:00 【CSDN】
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 [email protected]: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
边栏推荐
- 【Untitled】
- 程序员如何学习开源项目,这篇文章告诉你
- 从零开始Blazor Server(4)--登录系统
- STM32 Personal Notes - Embedded C Language Optimization
- ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
- 昇思大模型体验平台初体验——以小模型LeNet为例
- Shell:条件测试操作
- InputStream转成String
- How to implement deep copy in js?
- How does UXDB return the number of records for all tables in the current database?
猜你喜欢
随机推荐
How does UXDB return the number of records for all tables in the current database?
将本地项目推送到远程仓库
18张图,直观理解神经网络、流形和拓扑
InputStream转成String
js中如何实现深拷贝?
SQL Server database schema and objects related knowledge notes
三子棋(C语言实现)
50.【Application of dynamic two-dimensional array】
跨域网络资源文件下载
杰理AD14N/AD15N---串口中断问题
【无标题】
MacOS下postgresql(pgsql)数据库密码为什么不需要填写或可以乱填写
DBPack SQL Tracing 功能及数据加密功能详解
ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
opencv创建窗口—cv.namedWindow()
CTFshow,命令执行:web32
HoloView——实时数据
ClickHouse入门介绍与其特性
STM32 Personal Notes - Embedded C Language Optimization
量化日常工作指标








