Cómo crear un GIF animado a partir de archivos JPEG en Android (desarrollo)

Estoy buscando una manera simple de crear un GIF animado en una aplicación nativa de Android. Los archivos de origen deben ser JPEG (desde la cámara o lo que sea) y la salida debe guardarse como GIF en el dispositivo.

No quiero saber cómo reproducir animaciones o archivos GIF animados.

Para ser claro: quiero saber cómo poner imágenes individuales cuadro por cuadro en una “película” y luego guardarla como un archivo .gif.

Por ejemplo, esta aplicación puede hacer lo que quiero hacer.

Vea esta solución.

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

Es una versión de Android de esta publicación.

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

Para usar esta clase, aquí hay un ejemplo de método de ayuda para generar una matriz de bytes GIF. Tenga en cuenta que la función getBitmapArray () es un método para devolver todos los archivos de bitmap en un adaptador de imagen a la vez. Entonces, la entrada son todos los archivos de bitmap en un adaptador, la salida es una matriz de bytes que puede escribir en el archivo.

public byte[] generateGIF() { ArrayList 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(); } 

Para usar esta función, haga lo siguiente, luego puede guardar el archivo en la tarjeta SD.

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

Esto podría ayudarte. Es una clase que se usa para generar archivos gif.

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

Si solo desea mostrar estos mapas de bits como un gif animado, puede crear un dibujo animado usando este código:

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

Me fue muy bien, creó archivos de imágenes rápidas y de buena calidad

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

Solución 1

¿Has visto este artículo? ….. es con el código fuente …

Como sé, creo que Android no reproducirá la imagen de animación gif. Deberías usar la vista web que reproducirá la animación gif.

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

y si puedes …

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

Solución 2

Android proporciona Drawable Animation .

Gif es básicamente un conjunto de imágenes con un retraso de tiempo constante en cuadros. No puedes jugar gif directamente en Android. He trabajado mucho en la reproducción de animación gif en Android.

  • Cuando jugamos gif también manejamos todas las llamadas de reproducción de cuadros por nuestra cuenta. Entonces este no es el mejor enfoque

  • Si tiene un conjunto de imágenes simplemente reprodúzcalas por un retraso en los fotogtwigs. Eso sería lo único que quieres.

  • No se puede hacer gif en la aplicación por código nativo también. También existen algunos inconvenientes para usar el formato gif. Que me había enfrentado en mi juego.

  • Si tiene un conjunto de elementos dibujables, puede usar AnimationDrawable para mostrar una animación como gif también. También puede establecer cualquier vista.

También hice una vista personalizada para reproducir animaciones gif. Primero cargo gif y lo convierto en InputStream, luego lo paso a mi clase de vista personalizada para reproducir el 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; }