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
1. git clone git@github.com:jakar/qt-heif-image-plugin.git
首先我们直接编译会报错
这里本质就是我们找不到pkg-config的库,所以我们需要先解决编译环境配置问题
2.
配置构建环境
安装Libheif,github的readme中已经清楚说明了"Libheif is included in Vcpkg.",该库已经被包含在Vcpkg中,为了简化我们还需要自己编译Libheif,我们直接使用Vcpkg 进行安装Libheif
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
3.
安装Libheif(以64位位列)
指定安装(编译)64位库
> .\vcpkg\vcpkg install libheif:x64-windows
#指定安装(编译)32位库
> .\vcpkg\vcpkg install libheif:x86-windows
#默认安装32位
> .\vcpkg\vcpkg install 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"
解释:
cmake地址 -B ./build_2019 -G VS版本 -S ."-DCMAKE_TOOLCHAIN_FILE=E:\\Git\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake"
先修改CMAKE在执行上面的语句。CMAKE目录胃src/cmakelist,直接复制下面的并替换QT编译器路径
cmake_minimum_required(VERSION 3.5) # lowest version tried
#新增加===
#DEBUG增加后缀
set(CMAKE_DEBUG_POSTFIX "d")
set(LIBHEIF_PATH C:\\Users\\Admin\\vcpkg\\installed\\x64-windows)
set(QT_PATH "E:\\Qt\\5.12.6\\msvc2017_64" CACHE PATH "qt5 cmake dir")
set(CMAKE_PREFIX_PATH ${QT_PATH})
###此处路径添加你自己的
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
执行成功后,打开qt-heif-image-plugin-master\build_2019\qtheifimageplugin.sln 项目,选中X64或者x86,点击生成,即可在qt-heif-image-plugin-master\build_2019\bin\imageformats目录下发现生成的4个动态库
把qheif放到QT安装目录下 一个是debug版本 一个是release,编译的时候用的什么编译器版本则放到对应编译器版本下面 最后将另外3个生成的动态库 放到exe运行目录下即可。图为测试程序。3个动态库放到这下面即可。
tips:因为此库为QT插件的方式去开发的,所以不需要添加额外的头文件,只需要将插件库放到之前所说的Qt\5.12.6\msvc2017_64\plugins\imageformats目录下即可让Qimage支持此格式图片。将另外3个库放到exe执行目录下
测试代码
#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();
}
————————————————
版权声明:本文为CSDN博主「BUG_C++」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013052326/article/details/125351148
使用msvc2017 64位编译好的资源地址
注意 使用cmake只能生成64位的VS解决方案。
(3条消息) QT读取Heic文件已经使用msvc201764位编译好的-C++文档类资源-CSDN文库
想要生产32位插件库的话使用一下方法。
先使用QTCreator 新建一个插件工程
然后一直点击下一步即可。
然后使用VS 打开QT项目 将以下3个文件 拷贝到此工程中 ,然后添加.h和.cpp文件
将 这3个lib添加到工程
更改项目属性
将自动生产的插件工程.h改为如下 .cpp
#ifndef IMAGEIOPLUGIN_H
#define IMAGEIOPLUGIN_H
#include <QImageIOPlugin>
class ImageIOPlugin : public QImageIOPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "heif.json")
public:
QImageIOPlugin::Capabilities capabilities(QIODevice *device, const QByteArray &format) const override;
QImageIOHandler *create(QIODevice *device, const QByteArray &format) const override;
};
#endif // IMAGEIOPLUGIN_H
#include "imageioplugin.h"
#include "qheifhandler_p.h"
#include <qdebug.h>
QImageIOPlugin::Capabilities ImageIOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
{
qDebug() << "CSVImageIOPlugin::capabilities";
const bool formatOK = (format == "heic" || format == "heics"
|| format == "heif" || format == "heifs");
if (!formatOK && !format.isEmpty()) {
return {};
}
if (!device) {
if (formatOK) {
return CanRead | CanWrite;
}
else {
return {};
}
}
using F = QHeifHandler::Format;
Capabilities caps{};
if (device->isReadable() && QHeifHandler::canReadFrom(*device) != F::None) {
caps |= CanRead;
}
if (device->isWritable()) {
caps |= CanWrite;
}
return caps;
}
QImageIOHandler *ImageIOPlugin::create(QIODevice *device, const QByteArray &format) const
{
QImageIOHandler* handler = new QHeifHandler;
handler->setDevice(device);
handler->setFormat(format);
return handler;
}
点击编译即可生成32位QT heif插件库,同样的 放到QT安装目录下的插件库中,在将另外3个库放到exe执行目录下即可 工程在下面的链接中