GIF 是 Graphics Interchange Format (图形交换格式)的缩写,采用 Lempel-Zev-Welch(LZW)压缩算法,最高支持256种颜色。GIF 原本是有专利限制的,不过早就过期了,估计这也是 Qt 等开源库/框架只有对 GIF 解码没有编码操作的原因吧,但 ImageMagick 和 FFmpeg 等是支持 GIF 编解码操作的。
GIF 有 GIF87a 和 GIF89a 两个版本。
GIF87a 版本是 1987 年推出的,一个文件存储一个图像,严格不支持透明像素;GIF87a 采用 LZW 压缩算法,它能够在保持图像质量的前提下将图像尺寸压缩百分之二十到二十五。
GIF89a 版本是 1989 年推出的很有特色的版本,该版本允许一个文件存储多个图像,可实现动画功能,允许某些像素透明。在这个版本中,为 GIF 文档扩充了图形控制区块、备注、说明、应用程序编程接口 4 个区块,并提供了对透明色和多帧动画的支持。
其中 GIF89a 在透明、隔行交错和动画 GIF 方面做出了重大改进。首先是支持透明,GIF89a 允许图片中的某些部分不可见。这项特性非常重要,使得我们在某些场合能够利用这样一种特性来使图像的边缘不再呈现出矩形边框,而变成我们想要的任意形状。这些透明区域,可以很方便地在 Photoshop、Fireworks 中生成并且导出为 GIF89a 格式的 GIF 图片来实现。当然,透明并不意味着边框就不再存在事实上,它是存在的,只不过不显示罢了,这样可以使插入的图片和整体网页更加协调。
以上复制粘贴自百度, GIF 格式示意图如下:
而 giflib 是一个可以用来编解码 GIF 格式文件的 C 语言库,项目主页:http://giflib.sourceforge.net/
(为什么选择 giflib 呢?因为想在 C++ Qt 里生成 GIF 实在没找到好的库,另一个比较轻便的 gif.h 感觉不太好用,翻来覆去才找到 giflib 这个东西。可惜的是网上只有解码的代码,编码的代码几乎没有, giflib 的示例也很简单。最后,我也是折腾了很久才调通了最简单的 GIF 编码接口)
文本用例完整代码(配合 Qt 使用):https://github.com/gongjianbo/QtGifTool
1.MSVC 编译giflib 下载:https://sourceforge.net/projects/giflib/files/
我做的工程模板,用于生成 MSVC 版的 lib:https://github.com/gongjianbo/GifLib
从下载历史来看,最近下载最多的版本是 5.1.4 和 5.2.1 ,5.2.1 里移除了一个 GifQuantizeBuffer 函数,该函数可以将 rgb 数据转为 256 色数据并生成颜色表,由于没找到其他替代的接口,我编译 5.2.1 的时候又把该接口加上了。这两个版本目录也有点不一样,编译库只需要这 11 个文件就行了(5.1.4 的 lib 里):
一个简单的 CMakeList:
cmake_minimum_required (VERSION 3.8)
project (GifLib
VERSION 5.2.1
)
include_directories(${PROJECT_SOURCE_DIR}/source)
aux_source_directory(${PROJECT_SOURCE_DIR}/source source_files)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR})
file(GLOB head_files "${PROJECT_SOURCE_DIR}/source/*.h")
add_library(GifLib STATIC ${head_files} ${source_files})
install(FILES ${head_files} DESTINATION include)
IF (MSVC)
# add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
# add_definitions(-D_CRT_SECURE_NO_WARNINGS)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
set(build_flags "-D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS")
set_target_properties(GifLib PROPERTIES COMPILE_FLAGS ${build_flags})
ENDIF ()
当然,这时候 MSVC 还是编译不过的,需要把源码里的 unistd.h 注释掉:
#ifndef _WIN32
#include
#endif // !_WIN32
最后点生成,然后安装,就得到了 lib 和 include ,可以在项目中使用了。
在 Qt 中先测试一下:
INCLUDEPATH += $$PWD/GifLib_VS2019x64/include
LIBS += $$PWD/GifLib_VS2019x64/lib/GifLib.lib
//#include "gif_lib.h"
//测试接口是否可以调用
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?