8

Gif开发笔记(一):gif介绍、编译和工程模板

 3 years ago
source link: https://segmentfault.com/a/1190000038407124
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

若该文为原创文章,转载请注明原文出处

本文章博客地址: https://blog.csdn.net/qq21497936/article/details/110530966

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:三方库开发技术

前言

实现gif图片的解码和生成。

Gif

简介

GIF格式的名称是Graphics Interchange Format的缩写,是在1987年由Compu Serve公司为了填补跨平台图像格式的空白而发展起来的。GIF可以被PC和Mactiontosh等多种平台上被支持。

GIF是一种位图。位图的大致原理是:图片由许多的像素组成,每一个像素都被指定了一种颜色,这些像素综合起来就构成了图片。GIF采用的是Lempel-Zev-Welch(LZW)压缩算法,最高支持256种颜色。由于这种特性,GIF比较适用于色彩较少的图片,比如卡通造型、公司标志等等。如果碰到需要用真彩色的场合,那么GIF的表现力就有限了。GIF通常会自带一个调色板,里面存放需要用到的各种颜色。在Web运用中,图像的文件量的大小将会明显地影响到下载的速度,因此我们可以根据GIF带调色板的特性来优化调色板,减少图像使用的颜色数(有些图像用不到的颜色可以舍去),而不影响到图片的质量。

GIF格式和其他图像格式的最大区别在于,它完全是作为一种公用标准而设计的,由于Compu Serve网络的流行,许多平台都支持GIF格式。Compu Serve通过免费发行格式说明书推广GIF,但要求使用GIF文件格式的软件要包含其版权信息的说明。

版本

GIF具有GIF87a和GIF89a两个版本。

  • GIF87a版本是1987年推出的,一个文件存储一个图像,严格不支持透明像素;GIF87a采用LZW压缩算法,它能够在保持图像质量的前提下将图像尺寸压缩百分之二十到二十五。
  • GIF89a版本是1989年推出的很有特色的版本,该版本允许一个文件存储多个图像,可实现动画功能,允许某些像素透明。在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口4个区块,并提供了对透明色和多帧动画的支持。

其中GIF89a在透明、隔行交错和动画GIF方面做出了重大改进。首先是支持透明,GIF89a允许图片中的某些部分不可见。这项特性非常重要,使得我们在某些场合能够利用这样一种特性来使图像的边缘不再呈现出矩形边框,而变成我们想要的任意形状。这些透明区域,可以很方便地在Photoshop、Fireworks中生成并且导出为GIF89a格式的GIF图片来实现。当然,透明并不意味着边框就不再存在事实上,它是存在的,只不过不显示罢了,这样可以使插入的图片和整体网页更加协调。

特点

GIF格式的图像文件具有如下特点:

  • GIF格式图像文件的扩展名是“.gif”。
  • 对于灰度图像表现最佳。
  • 具有GIF87a和GIF89a两个版本。
  • 采用改进的LZW压缩算法处理图像数据。
  • 调色板数据有通用调色板和局部调色板之分,有不同的颜色取值。
  • 不支持24bit彩色模式,最多存储256色。

GifLib

简介

图形交换格式(c)是CompuServe Incorporated的版权所有。GIF(sm)是CompuServe Incorporated的服务标记属性。

该库用可以用于任何需要读/写GIF文件格式的应用程序。

CSDN:QQ群:1047134658(点击“文件”搜索“giflib”,群内与博文同步更新)

GifLib库编译

步骤一:解压

ERJRFnR.png!mobile

查看项目的目录结构,其实是linux的,所以应该是使用linux编译,先上msys。

步骤二:使用mysy重新部署目录结构

uaEBVjU.png!mobile

步骤三:引入Qt的mingw32

export PATH=$PATH:/mingw530_32/bin

步骤四:目录make,错误缺乏cc

3iuQNrq.png!mobile

make出现错误

eaiI7fF.png!mobile

引入CC

export CC=gcc

MBR3mqi.png!mobile

继续编译。

步骤五:出现错误“GifErrorString”

qERNFnn.png!mobile

本来准备解决,结果一看,已经有libgif.a了,所以其实报错的编译可能是其测试的其他demo示例需要依赖(经验之谈)。

Jfa6raM.png!mobile

模块化

7rmEzem.png!mobile

gifManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \
    $$PWD/GifManager.h

SOURCES += \
    $$PWD/GifManager.cpp


# mingw32 版本
INCLUDEPATH += \
        $$PWD/giflib-5.2.1-mingw32/include

LIBS += $$PWD/giflib-5.2.1-mingw32/lib/libgif.a

Demo

void GifManager::testRunEnv()
{
    qDebug() << __FILE__ << __LINE__ <<  QString(GifErrorString(D_GIF_SUCCEEDED));
    qDebug() << __FILE__ << __LINE__ <<  QString(GifErrorString(D_GIF_ERR_OPEN_FAILED));
    qDebug() << __FILE__ << __LINE__ <<  QString(GifErrorString(D_GIF_ERR_READ_FAILED));
    qDebug() << __FILE__ << __LINE__ <<  QString(GifErrorString(D_GIF_ERR_NOT_GIF_FILE));
    qDebug() << __FILE__ << __LINE__ <<  QString(GifErrorString(D_GIF_ERR_NO_IMAG_DSCR));
}

MviMNnj.png!mobile

运行结果

2aiayei.png!mobile

工程模板v1.0.0

对应模板“gifDemo_v1.0.0_基础模板_测试库是否加载成功.rar”。

若该文为原创文章,转载请注明原文出处

本文章博客地址: https://blog.csdn.net/qq21497936/article/details/110530966


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK