Jak stworzyć animowany GIF z JPEG w Androidzie (rozwój)

Szukam prostego sposobu na stworzenie animowanego GIFA w natywnej aplikacji na Androida. Pliki źródłowe powinny być JPEG (z aparatu lub co innego), A wyjście powinno być zapisane jako GIF na urządzeniu.

Nie chcę wiedzieć, jak odtwarzać animacje lub animowane pliki GIF.

Aby było jasne: chcę wiedzieć, jak umieścić pojedyncze obrazy klatka po klatce w "filmie", a następnie zapisać go jako.plik gif.

Np. Ta aplikacja może zrobić chcę chcę zrób.

Author: StinsonMaster, 2013-05-02

6 answers

Zobacz To rozwiązanie.

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

To wersja Androida tego posta.

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

Aby użyć tej klasy, poniżej znajduje się przykładowa metoda pomocnicza do generowania tablicy bajtów GIF. Uwaga funkcja getBitmapArray() jest metodą zwracania wszystkich plików bitmapowych w adapterze obrazu jednocześnie. Więc wejście to wszystkie pliki Bitmapowe w jednym adapterze, wyjście jest tablicą bajtów, którą można zapisać do pliku.

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

Aby użyć tej funkcji, wykonaj następujące czynności, a następnie możesz zapisać plik w SDcard.

FileOutputStream outStream = null;
        try{
            outStream = new FileOutputStream("/sdcard/generate_gif/test.gif");
            outStream.write(generateGIF());
            outStream.close();
        }catch(Exception e){
            e.printStackTrace();
        }
 53
Author: lifelogger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-29 02:54:42

To może Ci pomóc. Jest to klasa, która służy do generowania plików gif.

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

 6
Author: Jatin Malwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-22 09:15:17

Jeśli chcesz wyświetlać tylko te bitmapy jak animowany gif, możesz utworzyć AnimatedDrawable używając tego kodu:

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
Author: Abeer Iqbal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-10 15:32:15

Dla mnie bardzo dobrze, tworzy plik szybko i dobrej jakości obrazy

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

 3
Author: Đăng Huân,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 16:19:43

Rozwiązanie 1

Widziałeś ten artykuł? ..... jest z kodem źródłowym..

Z tego co wiem, android chyba nie odtwarza animacji gif. Powinieneś użyć widoku sieci Web, który będzie odtwarzał animację gif..

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

I jeśli możesz..

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

Rozwiązanie 2

Android zapewnia Rysowalną animację .

 1
Author: Bhavesh Hirpara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 06:32:53

Gif to w zasadzie zbiór obrazów ze stałym opóźnieniem czasowym w klatkach. Nie można bezpośrednio odtwarzać gif w Androidzie. Dużo pracowałem nad odtwarzaniem animacji gif w Androidzie.

  • Podczas grania w gif ' a obsługujemy również wszystkie wywołania odtwarzania klatek przez naszą siebie. Więc to nie jest najlepsze podejście

  • Jeśli masz zestaw obrazów, po prostu odtwarzaj je z opóźnieniem w klatkach. Że to wszystko, czego chcesz.

  • Nie można również tworzyć gif w aplikacji za pomocą kodu natywnego. Są niektóre wady, jak również za pomocą formatu gif. Z którym miałem do czynienia w mojej grze.

  • Jeśli masz zestaw rysunków, możesz użyć AnimationDrawable do pokazania animacji, takiej jak gif. Może również ustawić dowolny Widok.

Zrobiłem również niestandardowy widok do odtwarzania animacji gif. najpierw Ładuję gif i konwertuję go do InputStream, a następnie przekazuję go do mojej niestandardowej klasy widoku, aby odtworzyć 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
Author: Jatin Malwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-21 09:28:38