全部成交,
我需要在 MFC2010 中将 gif 格式的动画图片解码成一些位图文件。有没有解码gif图片的库?我不能使用 GDIPlus,因为程序必须在 windows XP 上运行。如果有人为我提供库、Activex、dll 或类似的东西,我将不胜感激。
非常感谢,谢文·扎格姆
使用 ImageMagick 的 C++ API ( Magick++ ) 非常简单:
/* list of Image to store the GIF's frames */
std::vector<Magick::Image> imageList;
/* read all the frames of the animated GIF */
Magick::readImages( &imageList, "animated.gif" );
/* optionnally coalesce the frame sequence depending on the expected result */
Magick::coalesceImages( &imageList, imageList.begin(), imageList.end());
/* store each frame in a separate BMP file */
for(unsigned int i = 0; i < imageList.size(); ++i) {
std::stringstream ss;
ss << "frame" << i << ".bmp";
imageList[i].write(ss.str());
}
WIC(包含在 Vista 中,可用于 XP)提供CLSID_WICGifDecoder
COM 组件。
使用 ImageMagick 的 C++ API (Magick++) 试试这个,在 VS210 上测试:
#include <Magick++.h>
#include <string>
#include <iostream>
#include <list>
using namespace std;
using namespace Magick;
void kk(char * nombre, char *ext)
{
/* list of Image to store the GIF's frames */
std::list<Magick::Image> imageList;
/* read all the frames of the animated GIF */
Magick::readImages( &imageList, nombre );
/* compone las diferencias para obtener los cuadros reales */
Magick::coalesceImages(&imageList,imageList.begin( ),imageList.end( ));
/* store each frame in a separate BMP file */
list <Magick::Image>::iterator it;
int i=1;
for ( it = imageList.begin( ); it != imageList.end( ); it++ , i++)
{
std::string name = "frame" + to_string((_Longlong)(i)) + ext ;
it->write(name);
}
}
int main( int /*argc*/, char ** argv)
{
// Initialize ImageMagick install location for Windows
InitializeMagick(*argv);
try {
kk("luni0.gif", ".png"); // using ".bmp", ".jpg", ".png", OK
return 0;
}
catch( exception &error_ )
{
cout << "Caught exception: " << error_.what() << endl;
return 1;
}
}
已经很久了,但我记得曾经使用OleLoadPicture在旧版本的 Windows 上打开 GIF 和 PNG 文件,尽管文档似乎表明它仅适用于 BMP、ICO 和 WMF。