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

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

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

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

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

【问题讨论】:

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

标签: android animation jpeg adt gif


【解决方案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.htmlgithub.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 文件。
    猜你喜欢
    • 2011-04-10
    • 2011-01-12
    • 1970-01-01
    • 2011-04-10
    • 2010-11-14
    • 2011-07-18
    • 2014-03-02
    相关资源
    最近更新 更多