利用CxImage实现编解码Gif图像代码举例
生活随笔
收集整理的這篇文章主要介紹了
利用CxImage实现编解码Gif图像代码举例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Gif(Graphics Interchange Format,圖形交換格式)是由CompuServe公司在1987年開發的圖像文件格式,分為87a和89a兩種版本。Gif是基于LZW算法的無損壓縮算法。Gif圖像是基于顏色表的,最多只支持8位(256色)。Gif減少了圖像調色板中的色彩數量,從而在存儲時達到減少圖像文件大小的目的。Gif分為靜態Gif和動畫Gif兩種,擴展名為.gif,是一種壓縮位圖格式,支持透明背景圖像,適用于多種操作系統。
下面利用CxImage開源庫,實現對Gif圖像進行編解碼,主要包括3個文件:
1. funset.h :
#ifndef _FUNSET_H_
#define _FUNSET_H_#include <string>using namespace std;void decoding_gif(string strGifName, string strSavePath);
void encoding_gif(string strImgPath, string strGifName);#endif //_FUNSET_H_
2. funset.cpp:
#include "stdafx.h"
#include "funset.h"
#include <iostream>
#include "../CxImage/ximagif.h"
#include <io.h>using namespace std;void decoding_gif(string strGifName, string strSavePath)
{CxImage img;img.Load(strGifName.c_str(), CXIMAGE_FORMAT_GIF);int iNumFrames = img.GetNumFrames();cout<<"frames num = "<<iNumFrames<<endl;CxImage* newImage = new CxImage();for (int i = 0; i < iNumFrames; i++) {newImage->SetFrame(i);newImage->Load(strGifName.c_str(), CXIMAGE_FORMAT_GIF);char tmp[64];sprintf(tmp, "%d", i);string tmp1;tmp1 = tmp1.insert(0, tmp);tmp1 = strSavePath + tmp1 + ".png";newImage->Save(tmp1.c_str(), CXIMAGE_FORMAT_PNG);}if (newImage) delete newImage;
}int TraverseFolder(const string strFilePath, string strImageNameSets[])
{int iImageCount=0;_finddata_t fileInfo;long handle = _findfirst(strFilePath.c_str(), &fileInfo);if (handle == -1L) {cerr << "failed to transfer files" << endl;return -1;}do {//cout << fileInfo.name <<endl;strImageNameSets[iImageCount] = (string)fileInfo.name;iImageCount ++;} while (_findnext(handle, &fileInfo) == 0);return iImageCount;
}void encoding_gif(string strImgPath, string strGifName)
{string strImgSets[100] = {};int iImgCount = TraverseFolder(strImgPath, strImgSets);string strTmp = strImgPath.substr(0, strImgPath.find_last_of("/") +1);CxImage** img = new CxImage*[iImgCount];if (img == NULL) {cout<<"new Cximage error!"<<endl;return;}for (int i = 0; i < iImgCount; i++) {string tmp1;tmp1 = strTmp + strImgSets[i];img[i] = new CxImage;img[i]->Load(tmp1.c_str(), CXIMAGE_FORMAT_PNG);}CxIOFile hFile;hFile.Open(strGifName.c_str(), "wb");CxImageGIF multiimage;multiimage.SetLoops(3);multiimage.SetDisposalMethod(2);multiimage.Encode(&hFile, img, iImgCount, false, false);hFile.Close();delete [] img;
}
3. main.cpp:
#include "stdafx.h"
#include <iostream>
#include "funset.h"using namespace std;int main(int argc, char* argv[])
{string strGifName = "../../Data/fire.gif";string strSavaPath = "../../Data/";decoding_gif(strGifName, strSavaPath);string strImgPath = "../../Data/*.png";strGifName = "../../Data/tmp.gif";encoding_gif(strImgPath, strGifName);cout<<"ok!!!"<<endl;return 0;
}
利用CxImage實現起來簡單吧!!!^_^
GitHub:https://github.com/fengbingchun/CxImage_Test
總結
以上是生活随笔為你收集整理的利用CxImage实现编解码Gif图像代码举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对称加密算法之RC4介绍及OpenSSL
- 下一篇: 非对称加密算法之RSA介绍及OpenSS