如何在 Android 中从 JPEG 创建动画 GIF(开发)

Posted

技术标签:

【中文标题】如何在 Android 中从 JPEG 创建动画 GIF(开发)【英文标题】:How to create an animated GIF from JPEGs in Android (development) 【发布时间】:2013-04-26 05:38:57 【问题描述】:

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

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

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

例如This App可以做我想做的。

【问题讨论】:

Here 是我独立的 Android 动画 GIF 作家。它很快,您可以选择抖动以获得更好的质量。 @dragon66 能否请您添加一个发布标签以便我们可以使用 JitPack? @TheRealChx101 还没有发布 @dragon66 然后做一个 :) 【参考方案1】:

查看此解决方案。

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

这是这篇文章的 Android 版本。

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();
        

【讨论】:

这是计算 8 位或 24 位颜色的 gif 吗? encoder.addFrame(bitmap);但是addFrame寻找图片路径对吗?AnimatedGifEncoder类型中的addFrame(Image)方法不适用于参数(Bitmap) @Achayan 它应该将 Bitmap 作为参数。 有一个图像处理库,类似于square.github.io/picasso,它使用Lifelogger提到的相同的AnimatedGifEncoder类-bumptech.github.io/glide/javadocs/latest/index.html,github.com/bumptech/glide 这对我来说很慢。我的 nexus 5x 上的一帧大约需要 6 秒。每帧为 1800x1000【参考方案2】:

这可能会对您有所帮助。这是一个用于生成gif文件的类。

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

【讨论】:

有一种方法可以做你想做的事。首先制作一个字节数组的图像。然后添加gif文件的头信息然后保存这个文件。 你有例子吗?我设法从字节数组中保存文件,但我不知道标题信息。 w3.org/Graphics/GIF/spec-gif89a.txt 关注这个。它包含所需的 gif 文件的所有标题信息。或 wiki git 格式并找到所有标题字节信息。然后只需将这些值添加到您的字节数组中。 这不是完美的答案,因为我没有可用的解决方案喷气机,但它是获得赏金的最接近的答案...... 谢谢 :) 我会尝试做同样的事情。 user3047840 对这个问题的回答非常完美。【参考方案3】:

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

//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

【讨论】:

这个编码器的一点是它可以逐帧写入动画gif以减少内存消耗 是不是也要保存gif文件? 是的,它保存了名为 animated.gif 的 gif【参考方案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();

【讨论】:

【参考方案5】:

解决方案 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。

【讨论】:

嗯...谢谢,但这只是播放 GIF 的方法。但我想用我设备上的文件创建一个新的 GIF 文件。我想知道如何将单个图像逐帧转换为“电影”,然后将其保存为 .gif 文件。我在你的链接中没有找到类似的东西。还是我瞎了? :) 您应该将此解释放在对原始问题的 EDIT 中;)【参考方案6】:

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;

【讨论】:

谢谢,但我没有问如何播放GIF文件。我问如何创建 GIF 文件。

以上是关于如何在 Android 中从 JPEG 创建动画 GIF(开发)的主要内容,如果未能解决你的问题,请参考以下文章

android如何在jpeg上创建鱼眼效果

如何在 Unity 中从 .fbx 文件创建 .anim 文件?

从一组 jpeg 图像创建动画 gif

如何在 Android 工作室中从现有活动创建片段

PHP - 从两个 JPEG 图像创建简单的动画 GIF?

在 Android 中从 sqlite 创建 Json