Qt 支持HEIC/HEIF格式图片

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执行目录下即可 工程在下面的链接中

https://download.csdn.net/download/qq_39501474/87739022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值