生活随笔
收集整理的這篇文章主要介紹了
C++生成GIF小结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?聲明:所有權利保留。
轉載必須說明出處:http://blog.csdn.net/cartzhang/article/details/44020175
近來需要把BMP或Kinect的內存圖片多張合成為小GIF圖片。找了找,東西不少,做個小結,以備以后用到。
一、GIF.h
此方法很簡單,就是一個頭文件。但是我沒有嘗試成功。可能的原因是我的BMP圖片的生成字節順序與GIF.H頭文件所要求的不一致。
Gif.h頭文件代碼如下:
?
使用方法如下:
[cpp]? view plain
?copy ???????????????????????? 頭文件出處出處:作者:Charlie?Tangora ? ?
github?地址:https://github.com/ginsweater/gif-h
二、CXimage?庫
此庫開源,可隨便下載。
使用下載的版本為702full版本。Vs2013編譯很順利,因為需要使用的64位版本,所以使用了x64的release模式。有個與mfc相關的編譯不過,直接無視了,本人用不上mfc。
生成的為lib的靜態庫。
我把所需要的頭文件和靜態庫拷貝的到自己建立的目錄下和各個對應的文件夾下,如圖:
?
Include?文件從CXimage中拷貝頭文件,lib庫文件為編譯后生成的x64文件里面的,包括Debug版本和Release版本。
網上找了個代碼,對CXimage的GIF寫了兩個函數。本人在基礎上稍微添加和修改了代碼。
其實主要是處理相關文件夾方便來調用的。非常感謝網友提供,頭文件和CPP文件如下:(文件出處為:http://blog.csdn.net/fengbingchun/article/details/43538081
若有問題,請隨時聯系,非常感謝!)
mGif.h頭文件:
?
[cpp]? view plain
?copy #pragma?once??#ifndef?_MGIF_H__??#define?_MGIF_H__????#include?<string>????using?namespace?std;??????void?decoding_gif(string?strGifName,?string?strSavePath);??void?encoding_gif(string?strImgPath,?string?strGifName);??????#endif?//?? mGif.CPP文件:
?
[cpp]? view plain
?copy ??#include?"mGif.h"????#include?"stdafx.h"??#include?"mGif.h"??#include?<iostream>??#include?"ximagif.h"??#include?<io.h>????using?namespace?std;????std::wstring?s2ws(const?std::string&?s)??{??????int?len;??????int?slength?=?(int)s.length()?+?1;??????len?=?MultiByteToWideChar(CP_ACP,?0,?s.c_str(),?slength,?0,?0);??????wchar_t*?buf?=?new?wchar_t[len];??????MultiByteToWideChar(CP_ACP,?0,?s.c_str(),?slength,?buf,?len);??????std::wstring?r(buf);??????delete[]?buf;??????return?r;??}????void?decoding_gif(string?strGifName,?string?strSavePath)??{??????CxImage?img;????????std::wstring?stemp?=?s2ws(strGifName);???????LPCWSTR?PicName?=?stemp.c_str();??????img.Load(PicName,?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(PicName,?CXIMAGE_FORMAT_GIF);????????????char?tmp[64];??????????sprintf(tmp,?"%d",?i);????????????string?tmp1;??????????tmp1?=?tmp1.insert(0,?tmp);????????????tmp1?=?strSavePath?+?tmp1?+?".png";??????????stemp?=?s2ws(tmp1);???????????PicName?=?stemp.c_str();??????????newImage->Save(PicName,?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?{????????????????????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;??????}??????std::wstring?stemp;??????LPCWSTR?PicName;??????for?(int?i?=?0;?i?<?iImgCount;?i++)?{??????????string?tmp1;??????????tmp1?=?strTmp?+?strImgSets[i];??????????stemp?=?s2ws(tmp1);???????????PicName?=?stemp.c_str();??????????img[i]?=?new?CxImage;??????????img[i]->Load(PicName,?CXIMAGE_FORMAT_BMP);????????????????????if?(0?==?img[i]->GetNumColors())??????????{??????????????img[i]->DecreaseBpp(8,?true);??????????}?????????????}????????CxIOFile?hFile;??????stemp?=?s2ws(strGifName);???????PicName?=?stemp.c_str();????????string?Method?=?"wb";??????std::wstring??stempmd?=?s2ws(Method);??????LPCWSTR?wMethod?=?stempmd.c_str();??????bool?BFlag?=?hFile.Open(PicName,?wMethod);????????CxImageGIF?multiimage;????????multiimage.SetLoops(-1);??????multiimage.SetFrameDelay(300);??????multiimage.SetDisposalMethod(2);??????multiimage.Encode(&hFile,?img,?iImgCount,?false,?false);????????hFile.Close();????????delete[]?img;??}?? main測試代碼:
?
[cpp]? view plain
?copy string?strImgPath?=?"img/*.bmp";????string?strGifName?=?"img/test.gif";??encoding_gif(strImgPath,?strGifName);?? 測試結果是可以生成gif圖片。再次表示感謝!
中途有個事情說下:在編譯測試的過程中有個錯誤提示
cximage.lib(ximapsd.obj) :?error LNK2001: 無法解析的外部符號 _psd_image_free? cximage.lib(ximapsd.obj) : error LNK2019: 無法解析的外部符號 _psd_main_loop
解決方案: libdcr.lib libpsd.lib 將這兩個包括進來就可以了。 三、CreateGIF
Csdn上資源:http://download.csdn.net/detail/iamshuke/2567835
非常感謝!若有問題,請隨時聯系。
本程序是用基于MFC的,對于我來使用,我不用MFC。
其中重要的文件,其他的都是調用過程:
主要函數貼下:
?
?
[html]? view plain
?copy BOOL?GetData(HBITMAP?hBmp,BYTE?**ppPalette,BYTE?**ppData,BYTE?*pBitsPixel,int?*pWidth,int?*pHeight);????void?CreateGIFHeard(CFile?&file,WORD?nImageWidth,WORD?nImageHeight,BYTE?bitsPixel);????void?AddImageToGIF(CFile?&file,BYTE?*pData,BYTE?*palette,WORD?nImageWidth,WORD?nImageHeight,BYTE?bitsPixel,WORD?nDelay,?????????????????????short?int?nTransparentColorIndex);????void?CloseGIF(CFile?&file);??
總結
以上是生活随笔為你收集整理的C++生成GIF小结的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。