45 votes

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

Je suis à la recherche d'un moyen simple de créer un GIF animé dans une application Android native. Les fichiers sources doivent être au format JPEG (à partir de la caméra ou ce que jamais) et la sortie doit être enregistré sous le GIF sur le périphérique.

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

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

par exemple, Cette Application peut faire ce que je veux faire.

57voto

lifelogger Points 324

Voir cette solution.

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

C'est une version Android de ce post.

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

Pour utiliser cette classe, voici un exemple de méthode d'aide à générer des GIF tableau d'octets. Notez ici le getBitmapArray fonction() est une méthode pour renvoyer tous les fichiers Bitmap dans une image de l'adaptateur à la fois. Donc l'entrée est de tous les fichiers Bitmap dans une seule carte, 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 de la manière suivante ensuite, vous pouvez enregistrer le fichier dans la carte sd.

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

6voto

Jatin Malwal Points 1077

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/

4voto

1voto

sunshine Points 3779

Solution 1

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

Que je sache, je pense que android ne va pas jouer animation gif image. Vous devez utiliser webview qui jouera 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 Drawable Animation.

0voto

Jatin Malwal Points 1077

Gif est essentiellement un ensemble d'images avec une constante de temps de retard dans les cadres. Vous ne pouvez pas jouer directement gif android. J'ai travaillé beaucoup sur la lecture de gif animation dans android.

  • Lors de la lecture de gif nous nous occupons également de tous les appels de jouer cadres par notre auto. Ce n'est donc pas une meilleure approche

  • Si vous avez des images de tout simplement jouer eux par un retard dans les images. Que serait tout ce que vous voulez.

  • Vous ne pouvez pas faire de gif en application en code natif ainsi. Il y a certains inconvénients aussi bien pour l'utilisation du format gif. Qui j'avais rencontrés dans mon jeu.

  • Si vous avez réglé le de un drawable vous pouvez utiliser AnimationDrawable pour montrer aanimation comme gif ainsi. Il peut également définir le tout point de Vue.

J'avais aussi fait un affichage personnalisé à jouer les animations gif. J'ai d'abord charger gif et de le convertir en InputStream puis je le passe à ma vue personnalisée de la classe pour jouer 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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X