当前位置:网站首页>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
边栏推荐
猜你喜欢
PowerPC技术与市场杂谈
Node's traditional and advanced practices for formatting time (moment)
ClickHouse入门介绍与其特性
What's up with VS "Cannot find or open PDB file"?How to solve
STM32 Personal Notes - Watchdog
BGP综合实验
SAP ABAP OData 服务如何支持 $orderby (排序)操作试读版
ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
报告:想学AI的学生数量已涨200%,老师都不够用了
【软件架构模式】MVVM模式和MVC模式区别
随机推荐
STM32 Personal Notes - Embedded C Language Optimization
解决new Thread().Start导致高并发CPU 100%的问题
mysql login in cmd and basic operations of database and table
MySQL 必现之死锁
STM32个人笔记-嵌入式C语言优化
Introduction to ADAS
将本地项目推送到远程仓库
Intensive reading of ACmix papers, and analysis of its model structure
Idea common plugins
What's up with VS "Cannot find or open PDB file"?How to solve
Google Earth Engine APP——15行代码搞定一个inspector高程监测APP
Analysis of High Availability Solution Based on MySql, Redis, Mq, ES
[Dataset] Dataset summary of various insulators, bird's nests and anti-vibration hammers
Google Earth Engine——给影像添加一个属性对于单景的时间序列并返回影像
PowerPC技术与市场杂谈
What are the common API security flaws?
node 格式化时间的传统做法与高级做法(moment)
浏览器快捷键大全
笔记。。。。
How programmers learn open source projects, this article tells you