web-dev-qa-db-ja.com

Android(開発)でJPEGからアニメーションGIFを作成する方法

ネイティブAndroidアプリケーションでアニメーションGIFをcreateする簡単な方法を探しています。ソースファイルはJPEG(カメラなど)であり、出力はデバイスにGIFとして保存する必要があります。

アニメーションやアニメーションGIFファイルの再生方法を知りたくありません。

明確にするために、フレームごとに1つの画像を「ムービー」に入れて、それを.gifファイルとして保存する方法を知りたいです。

例えば このアプリ やりたいことができます。

43
StinsonMaster

このソリューションをご覧ください。

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

Androidこの投稿のバージョンです。

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

このクラスを使用するために、GIFバイト配列を生成するヘルパーメソッドの例を次に示します。ここで注意してください、getBitmapArray()関数は、イメージアダプター内のすべてのビットマップファイルを一度に返すメソッドです。したがって、入力は1つのアダプター内のすべてのビットマップファイルであり、出力はファイルに書き込むことができるバイト配列です。

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

この機能を使用するには、次の手順を実行してから、ファイルをSDcardに保存できます。

FileOutputStream outStream = null;
        try{
            outStream = new FileOutputStream("/sdcard/generate_gif/test.gif");
            outStream.write(generateGIF());
            outStream.close();
        }catch(Exception e){
            e.printStackTrace();
        }
55
lifelogger

これはあなたを助けるかもしれません。これは、gifファイルを生成するために使用されるクラスです。

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

6
Jatin Malwal

それは私にとって非常にうまくいきました、ファイルを高速で良質の画像を作成します

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

4
Đăng Huân

これらのビットマップをアニメーションGIFのようにのみ表示する場合は、次のコードを使用してAnimated Drawableを作成できます。

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();
3
Abeer Iqbal

ソリューション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 を提供します。

1
Bhavesh Hirpara

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;
}
0
Jatin Malwal