web-dev-qa-db-fra.com

Comment créer un GIF animé à partir de JPEG dans Android (développement)

Je cherche un moyen simple de créer un GIF animé dans une application native Android. Les fichiers source doivent être JPEG (de l'appareil photo ou autre) et la sortie doit être enregistrée au format GIF sur l'appareil.

Je ne veux pas savoir comment lire des animations ou des fichiers GIF animés.

Pour être clair: je veux savoir comment mettre des images individuelles image par image dans un "film", puis l'enregistrer en tant que fichier .gif.

par exemple. Cette appli peut faire ce que je veux faire.

43
StinsonMaster

Voir cette solution.

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

Il s'agit d'une version Android version de cet article.

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

Pour utiliser cette classe, voici un exemple de méthode d'assistance pour générer un tableau d'octets GIF. Notez ici que la fonction getBitmapArray () est une méthode pour renvoyer tous les fichiers Bitmap dans un adaptateur d'image à la fois. Ainsi, l'entrée est tous les fichiers Bitmap dans un adaptateur, la sortie est un tableau d'octets que vous pouvez écrire dans le fichier.

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

Pour utiliser cette fonction, procédez comme suit, puis vous pouvez enregistrer le fichier dans 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

Cela pourrait vous aider. C'est une classe qui est utilisée pour générer des fichiers gif.

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

6
Jatin Malwal

Il a très bien fonctionné pour moi, il a créé des images de fichiers rapides et de bonne qualité

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

Si vous souhaitez uniquement afficher ces bitmaps comme un gif animé, vous pouvez créer un dessin animé en utilisant ce code:

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

Solution 1

Avez-vous vu cet article? ..... c'est avec le code source ..

Comme je sais, je pense que Android ne jouera pas l'image d'animation gif. Vous devriez utiliser une vue Web qui jouera l'animation gif ..

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

et si vous le pouvez ..

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

Solution 2

Android fournit Animation Drawable .

1
Bhavesh Hirpara

Gif est essentiellement un ensemble d'images avec un délai constant dans les images. Vous ne pouvez pas jouer directement au gif sous Android. J'ai beaucoup travaillé sur la lecture d'animation gif dans Android.

  • Lors de la lecture de gif, nous gérons également tous les appels de jeux d'images par nous-mêmes. Ce n'est donc pas une meilleure approche

  • Si vous avez défini des images, lisez-les simplement par un retard dans les images. Ce serait tout ce que vous voulez.

  • Vous ne pouvez pas non plus faire de gif dans une application avec du code natif. Il existe également des inconvénients pour l'utilisation du format gif. Ce à quoi j'avais fait face dans mon jeu.

  • Si vous avez un ensemble de dessinables, vous pouvez également utiliser AnimationDrawable pour afficher une animation comme un gif. Il peut également définir n'importe quelle vue.

J'avais également fait une vue personnalisée pour jouer aux animations gif. Je charge d'abord le gif et le convertis en InputStream puis je le passe à ma classe de vue personnalisée pour lire le 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