47

我正在寻找一种在原生 Android 应用程序中创建动画 GIF 的简单方法。源文件应该是 JPEG(来自相机或其他),输出应该在设备上保存为 GIF。

我不想知道如何播放动画或动画 GIF 文件。

要清楚:我想知道如何将单个图像逐帧放入“电影”中,然后将其保存为 .gif 文件。

例如,这个应用程序可以做我想做的事情。

4

6 回答 6

58

请参阅此解决方案。

https://github.com/nbadal/android-gif-encoder

这是这篇文章的安卓版本。

http://www.jappit.com/blog/2008/12/04/j2me-animated-gif-encoder/

要使用这个类,这里​​有一个生成 GIF 字节数组的示例帮助方法。请注意,getBitmapArray() 函数是一种一次性返回图像适配器中所有位图文件的方法。所以输入是一个适配器中的所有位图文件,输出是一个字节数组,您可以将其写入文件。

public byte[] generateGIF() {
    ArrayList<Bitmap> bitmaps = adapter.getBitmapArray();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    AnimatedGifEncoder encoder = new AnimatedGifEncoder();
    encoder.start(bos);
    for (Bitmap bitmap : bitmaps) {
        encoder.addFrame(bitmap);
    }
    encoder.finish();
    return bos.toByteArray();
}

要使用此功能,请执行以下操作,然后您可以将文件保存到 SD 卡中。

FileOutputStream outStream = null;
        try{
            outStream = new FileOutputStream("/sdcard/generate_gif/test.gif");
            outStream.write(generateGIF());
            outStream.close();
        }catch(Exception e){
            e.printStackTrace();
        }
于 2013-11-29T02:54:42.880 回答
7

这可能会帮助你。这是一个用于生成 gif 文件的类。

http://elliot.kroo.net/software/java/GifSequenceWriter/

于 2013-11-22T09:15:17.757 回答
6

它对我来说做得很好,它可以快速创建文件并提供高质量的图像

//True for dither. Will need more memory and CPU
AnimatedGIFWriter writer = new AnimatedGIFWriter(true);
OutputStream os = new FileOutputStream("animated.gif");
Bitmap bitmap; // Grab the Bitmap whatever way you can
// Use -1 for both logical screen width and height to use the first frame dimension
writer.prepareForWrite(os, -1, -1)
writer.writeFrame(os, bitmap);
// Keep adding frame here
writer.finishWrite(os);
// And you are done!!!

https://github.com/dragon66/android-gif-animated-writer

于 2017-09-26T16:19:43.503 回答
4

如果您只想像动画 gif 一样显示这些位图,可以使用以下代码创建AnimatedDrawable :

AnimationDrawable animation = new AnimationDrawable();
animation.addFrame(getResources().getDrawable(R.drawable.image1), 10);
animation.addFrame(getResources().getDrawable(R.drawable.image2), 50);
animation.addFrame(getResources().getDrawable(R.drawable.image3), 30);
animation.setOneShot(false);

ImageView imageAnim =  (ImageView) findViewById(R.id.imageView);
imageAnim.setImageDrawable(animation);

// start the animation!
animation.start();
于 2016-07-31T06:36:17.240 回答
1

解决方案 1

你看过这篇文章吗?.....它带有源代码..

据我所知,我认为 android 不会播放 gif 动画图像。您应该使用将播放 gif 动画的 webview..

http://droid-blog.net/2011/10/14/tutorial-how-to-use-animated-gifs-in-android-part-1/

如果可以的话..

http://androidosbeginning.blogspot.in/2010/09/gif-animation-in-android.html

解决方案 2

Android 提供Drawable Animation

于 2013-05-02T06:14:20.970 回答
0

Gif 基本上是一组具有恒定帧时间延迟的图像。你不能直接在android中播放gif。我在 android 中播放 gif 动画方面做了很多工作。

  • 在播放 gif 时,我们也自己处理所有播放帧的调用。所以这不是最好的方法

  • 如果您有一组图像,只需按帧延迟播放它们。这就是你想要的。

  • 您也不能通过本机代码在应用程序中制作 gif。使用 gif 格式也有一些缺点。这是我在比赛中遇到的。

  • 如果您有一组可绘制对象,您也可以使用 AnimationDrawable来显示类似 gif 的动画。它还可以设置任何视图。

我还制作了一个自定义视图来播放 gif 动画。首先,我加载 gif 并将其转换为 InputStream,然后将其传递给我的自定义视图类以播放 gif。

 public class GifWebView extends View {
    private Movie mMovie;
    InputStream mStream;
    long mMoviestart;
    private boolean play;

public GifWebView(Context context, InputStream stream) {
    super(context);
    mStream = stream;
    setPlay(true);
    mMovie = Movie.decodeStream(mStream);
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawColor(Color.TRANSPARENT);
    super.onDraw(canvas);
    final long now = SystemClock.uptimeMillis();

    if (mMoviestart == 0) {
        mMoviestart = now;
    }
    final int relTime = (int) ((now - mMoviestart) % mMovie.duration());

    mMovie.setTime(relTime);
    mMovie.draw(canvas, 20, 20);
    if (play) {
        Log.i("reltime", "" + relTime + ",duration:" + mMovie.duration());
        this.invalidate();
    }
}

@Override
public boolean onTouchEvent(android.view.MotionEvent event) {
    return true;
};

public boolean isPlay() {
    return play;
}
于 2013-11-21T09:28:38.077 回答