opencv 打开gif图片

来源:互联网 发布:怎么用淘宝客推广 编辑:程序博客网 时间:2024/04/30 18:32

我直接来全套把,不然很多新手不知道怎么弄

1、首先下载FreeImage3160Win32.zip版本有可能不同,链接赏给你:下载地址点击打开链接


2、打开找到FreeImage.dll FreeImage.lib, FreeImage.h拷贝到项目中去。


3、开始使用在cpp中导入静态库

#include "FreeImage.h"  
#pragma comment(lib,"FreeImage.lib")


下面的转化代码我就拷贝一个他人的了,嘻嘻。节约时间

IplImage*  gif2ipl(const char* filename){FreeImage_Initialise();         //load the FreeImage function lib  FREE_IMAGE_FORMAT fif = FIF_GIF;FIBITMAP* fiBmp = FreeImage_Load(fif, filename, GIF_DEFAULT);FIMULTIBITMAP * pGIF = FreeImage_OpenMultiBitmap(fif, filename, 0, 1, 0, GIF_PLAYBACK);//  FIBITMAPINFO fiBmpInfo = getfiBmpInfo(fiBmp);  int gifImgCnt = FreeImage_GetPageCount(pGIF);FIBITMAP * pFrame;int width, height;width = FreeImage_GetWidth(fiBmp);height = FreeImage_GetHeight(fiBmp);IplImage * iplImg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);iplImg->origin = 1;//should set to 1-top-left structure(Windows bitmap style)  RGBQUAD* ptrPalette = new RGBQUAD; // = FreeImage_GetPalette(fiBmp);  BYTE intens;BYTE* pIntensity = &intens;cvNamedWindow("gif", 0);printf("gifImgCnt %d \n", gifImgCnt);for (int curFrame = 0; curFrame < gifImgCnt; curFrame++){pFrame = FreeImage_LockPage(pGIF, curFrame);//ptrPalette = FreeImage_GetPalette(pFrame);  char * ptrImgDataPerLine;for (int i = 0; i < height; i++){ptrImgDataPerLine = iplImg->imageData + i*iplImg->widthStep;for (int j = 0; j < width; j++){//get the pixel index   //FreeImage_GetPixelIndex(pFrame,j,i,pIntensity);    FreeImage_GetPixelColor(pFrame, j, i, ptrPalette);ptrImgDataPerLine[3 * j] = ptrPalette->rgbBlue;ptrImgDataPerLine[3 * j + 1] = ptrPalette->rgbGreen;ptrImgDataPerLine[3 * j + 2] = ptrPalette->rgbRed;//ptrImgDataPerLine[3*j] = ptrPalette[intens].rgbBlue;  //ptrImgDataPerLine[3*j+1] = ptrPalette[intens].rgbGreen;  //ptrImgDataPerLine[3*j+2] = ptrPalette[intens].rgbRed;  }}printf("convert curFrame end %d \n", curFrame);cvShowImage("gif", iplImg);cvWaitKey(30);FreeImage_UnlockPage(pGIF, pFrame, 1);}FreeImage_Unload(fiBmp);FreeImage_DeInitialise();return iplImg;}



接下来就是我们的调用了


IplImage *pImage = cvLoadImage("Verifycode.gif", CV_LOAD_IMAGE_UNCHANGED);if (pImage==NULL){const char * ch = "Verifycode.gif";pImage = gif2ipl("Verifycode.gif");}

解释一下上面的代码,我是从网络中下载来的图,有可能是其他格式,如果打不开,说明是gif。



看来以后不能乱用他人的代码,得先自己写一写。这个代码有问题,内存没有释放完毕。也就是说你打开了一张图,他会一直占用哈哈 20141226

return前面加一条FreeImage_CloseMultiBitmap(pGIF, GIF_DEFAULT);


请注意了!

0 0