当前位置:网站首页>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
边栏推荐
- shell脚本------条件测试 if语句和case分支语句
- 基于CAP组件实现补偿事务与消息幂等性
- WLAN networking experiment of AC and thin AP
- How to query database configuration parameters in GBase 8c, such as datestyle
- rpm and yum
- PDMan-国产免费通用数据库建模工具(极简,漂亮)
- 已解决(pip安装库报错)Consider using the-- user option or check the permissions.
- 微服务:事务管理
- redis
- scrapy爬虫框架的使用
猜你喜欢

Node's traditional and advanced practices for formatting time (moment)

Message queue interview latest finishing (2022)

Intensive reading of ACmix papers, and analysis of its model structure

PowerPC技术与市场杂谈

How programmers learn open source projects, this article tells you

Opencv creates a window - cv.namedWindow()

程序员如何学习开源项目,这篇文章告诉你

Yang Hui Triangle (C language implementation)

redis

STM32个人笔记-看门狗
随机推荐
ClickHouse入门介绍与其特性
WTM:ASP.NET Core快速开发利器!
mysql在cmd的登录及数据库与表的基本操作
STM32入门开发 介绍IIC总线、读写AT24C02(EEPROM)(采用模拟时序)
Get the Token from the revised version of Qubutu Bed
Three chess (C language implementation)
cisco交换机基本配置命令(华为交换机保存命令是什么)
在GBase 8c数据库后台,使用什么样的命令来对gtm、dn节点进行主备切换的操作
还在纠结报表工具的选型么?来看看这个
自定义类型——枚举、联合
In the background of the GBase 8c database, what command is used to perform the master-slave switchover operation for the gtm and dn nodes
CTO强烈禁止使用Calendar,那用啥?
redis
CTFshow,命令执行:web32
Introduction to ADAS
CTO strongly banning the use of the Calendar, that in what?
notes....
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条
InputStream转成String
STM32 personal notes - program run and fly