前に、OpenCVでGIFの読み書きできないのでimgctl.dllを使うというの買いた。
それに加えてGIFアニメーションの出力というのも作ってみた。
コードは以下のように書いた。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "imgctl.h"
#include "opencv2/opencv.hpp"
int save_GIF_Anime(char *filename,IplImage *image[],int pages,int time1)
{
HDIB hDibs[255];
BITMAPINFO bmpInfo;
unsigned char *bitmapData[255];
DWORD ret;
int wd,ht;
int i,j,p;
if (pages>255) { return 1; /* error: too many pages */ }
for (p=0;p<pages;p++) {
wd = image[p]->width;
ht = image[p]->height;
bitmapData[p] = (unsigned char *)malloc(wd*ht*3);
if (bitmapData[p]==NULL) {
return 1; // error
}
ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = wd;
bmpInfo.bmiHeader.biHeight = ht;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = BI_RGB;
for (i=0;i<ht;i++) {
for (j=0;j<wd;j++) {
bitmapData[p][ (j+(ht-i-1)*wd)*3 ] = image[p]->imageData[image[p]->widthStep*i+j*3];
bitmapData[p][ (j+(ht-i-1)*wd)*3+1] = image[p]->imageData[image[p]->widthStep*i+j*3+1];
bitmapData[p][ (j+(ht-i-1)*wd)*3+2] = image[p]->imageData[image[p]->widthStep*i+j*3+2];
}
}
// create HDIB data
hDibs[p] = NULL;
hDibs[p] = CreateDIB(&bmpInfo,bitmapData[p]);
}
// AnimeGIF output
ret = DIBtoGIFAni(filename,hDibs,(DWORD)pages,(WORD)time1);
if (!ret) {
for (p=0;p<pages;p++) {
DeleteDIB(hDibs[p]);
}
return 1; // Error: output failed
}
for (p=0;p<pages;p++) {
free(bitmapData[p]);
DeleteDIB(hDibs[p]);
}
return 0;
}
int main()
{
IplImage *images[255];
char filename1[255];
int i,ret;
int page_num,timer;
page_num = 10; // Number of JPEGs
timer = 50; // GIF Anime play time per frame .. (unit == 1/100sec)
// load JPEG
for (i=0;i<page_num;i++) {
sprintf(filename1,"test%03d.jpg",i);
images[i] = cvLoadImage(filename1, CV_LOAD_IMAGE_COLOR);
if (images[i]==NULL) { printf("Error: file not found.\n"); return 1; }
}
// output to GIF anime
ret = save_GIF_Anime("output.gif",images,page_num,timer);
if (ret!=0) { printf("Error\n"); return 1; }
return 0;
}
連番のJPGファイルを読み込んで、GIFアニメーションのGIFファイルを出力するサンプルコードだ。
これを元にして、全天周カメラTHETAの全天周画像から風景を見回すアニメーションをGIFファイルのサムネイルとして作成するソフトというのを作り中だったりする。