android skia 解析gif图片
16lz
2021-01-24
SkMovie* fMovie;
FILE *fp;
int flen;
int frame;
GifFileType* fGIF;
static int Decode(GifFileType* fileType, GifByteType* out, int size)
{
SkStream* stream = (SkStream*) fileType->UserData;
return (int) stream->read(out, size);
}
void Java_SkiaView_drawGIF(JNIEnv *env,
jobject thizz, jobject canvas)
{
if (fMovie)
{
if (fMovie->duration())
{
fMovie->setTime(SkTime::GetMSecs() % fMovie->duration());
}
else
{
fMovie->setTime(0);
}
SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas );
canv->drawBitmap(fMovie->bitmap(), 0, 0);
}
else
{
LOGE("SkMovie::DecodeFile\n");
fp=fopen("/sdcard/back.gif","r");
fseek(fp, 0L, SEEK_END); //把位置指针移到文件末尾
flen = ftell(fp); //求出文件的总字节数
rewind(fp);
unsigned char* buffer = new unsigned char[flen];
fread(buffer,flen,1,fp);
fclose(fp);
frame = 0;
SkMemoryStream* stream = new SkMemoryStream(buffer, flen, false);
fGIF = DGifOpen( stream, Decode );
if (DGifSlurp(fGIF) != GIF_OK)
{
DGifCloseFile(fGIF);
fGIF = NULL;
}
frame = fGIF->ImageCount;
fMovie = SkMovie::DecodeMemory(((SkStream*)(fGIF->UserData))->getMemoryBase(), flen);
delete []buffer;
delete stream;
LOGE("/sdcard/loading.gif frame: %d", frame);
}
}
FILE *fp;
int flen;
int frame;
GifFileType* fGIF;
static int Decode(GifFileType* fileType, GifByteType* out, int size)
{
SkStream* stream = (SkStream*) fileType->UserData;
return (int) stream->read(out, size);
}
void Java_SkiaView_drawGIF(JNIEnv *env,
jobject thizz, jobject canvas)
{
if (fMovie)
{
if (fMovie->duration())
{
fMovie->setTime(SkTime::GetMSecs() % fMovie->duration());
}
else
{
fMovie->setTime(0);
}
SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas );
canv->drawBitmap(fMovie->bitmap(), 0, 0);
}
else
{
LOGE("SkMovie::DecodeFile\n");
fp=fopen("/sdcard/back.gif","r");
fseek(fp, 0L, SEEK_END); //把位置指针移到文件末尾
flen = ftell(fp); //求出文件的总字节数
rewind(fp);
unsigned char* buffer = new unsigned char[flen];
fread(buffer,flen,1,fp);
fclose(fp);
frame = 0;
SkMemoryStream* stream = new SkMemoryStream(buffer, flen, false);
fGIF = DGifOpen( stream, Decode );
if (DGifSlurp(fGIF) != GIF_OK)
{
DGifCloseFile(fGIF);
fGIF = NULL;
}
frame = fGIF->ImageCount;
fMovie = SkMovie::DecodeMemory(((SkStream*)(fGIF->UserData))->getMemoryBase(), flen);
delete []buffer;
delete stream;
LOGE("/sdcard/loading.gif frame: %d", frame);
}
}
更多相关文章
- 使用MAT查看Android内存泄露
- day2
- Android打开外部DB文件
- Android(安卓)SDCard操作(文件读写,容量计算)
- Hbuild项目Android本地打包
- Sense4+ Android(安卓)4.1.1去除拨号连接线办法
- Flutter 在Android(安卓)Studio中找不到真机设备
- Java的 ProcessBuilder & Process| 在android中用adb 执行一个li
- android I/DEBUG堆栈信息