首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用AnimatedGifEncoder在Android上生成Gif

用AnimatedGifEncoder在Android上生成Gif
EN

Stack Overflow用户
提问于 2019-12-24 10:38:46
回答 1查看 385关注 0票数 0

我想用AnimatedGifEncoder创建一个gif文件,它的工作--我的gif是成功创建的--但是我不能改变框架和其他设置之间的延迟,比如质量等等。

这门课在android上还有其他用途吗?

这是我的代码:

代码语言:javascript
复制
public final class CreateGifUtil extends AbstractAnimatedResource {
private String filename = null;

public CreateGifUtil(Context ctx, List<QueueItem> queueItems) {
    super(ctx, queueItems);
}

@Override
public void generate() {
    if (!queueItems.isEmpty()) {
        AnimatedGifEncoder encoder = new AnimatedGifEncoder();

        BufferedOutputStream bs = null;
        try {
            File mediaSrc = ResourceUtil.getOutputFolder(ctx, ResourceUtil.Folder.IMAGES);
            String filename = "test" + String.valueOf(System.currentTimeMillis()) + ".gif";
            outputFile = new File(mediaSrc.getAbsolutePath(), filename);
            bs = new BufferedOutputStream(new FileOutputStream(outputFile));
            encoder.start(bs);
            if (isUseFps()) {
                encoder.setFrameRate(getFps());
            }
            encoder.setRepeat(2);
            encoder.setQuality(getQuality());
            for (QueueItem item : queueItems) {
                if (isUseDelayTime()) {
                    encoder.setDelay(getDelayTime());
                }
            encoder.addFrame(getBitmapFromResource(item.getFilepath(), 1));
            }
            boolean result = encoder.finish();
            Log.e("123", String.valueOf(result));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (bs != null) {
                try {
                    bs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

private Bitmap getBitmapFromResource(String filePath, int sampleSize) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = sampleSize;
        return BitmapFactory.decodeFile(filePath, options);
    }
}

这是我的代码:

代码语言:javascript
复制
package autoshooter.draegerit.de.autoshooter.video;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import autoshooter.draegerit.de.autoshooter.queue.QueueItem;
import autoshooter.draegerit.de.autoshooter.util.ResourceUtil;

public final class CreateGifUtil extends AbstractAnimatedResource {

private String filename = null;

public CreateGifUtil(Context ctx, List<QueueItem> queueItems) {
    super(ctx, queueItems);
}

@Override
public void generate() {
    if (!queueItems.isEmpty()) {
        AnimatedGifEncoder encoder = new AnimatedGifEncoder();

        BufferedOutputStream bs = null;
        try {
            File mediaSrc = ResourceUtil.getOutputFolder(ctx, ResourceUtil.Folder.IMAGES);

            String filename = "test" + String.valueOf(System.currentTimeMillis()) + ".gif";

            outputFile = new File(mediaSrc.getAbsolutePath(), filename);
            bs = new BufferedOutputStream(new FileOutputStream(outputFile));
            encoder.start(bs);

            if (isUseFps()) {
                encoder.setFrameRate(getFps());
            }

            encoder.setRepeat(2);
            encoder.setQuality(getQuality());

            for (QueueItem item : queueItems) {
                if (isUseDelayTime()) {
                    encoder.setDelay(getDelayTime());
                }
                encoder.addFrame(getBitmapFromResource(item.getFilepath(), 1));
            }




            boolean result = encoder.finish();
            Log.e("123", String.valueOf(result));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (bs != null) {
                try {
                    bs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

private Bitmap getBitmapFromResource(String filePath, int sampleSize) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = sampleSize;
    return BitmapFactory.decodeFile(filePath, options);
}

}

EN

回答 1

Stack Overflow用户

发布于 2019-12-24 17:12:26

我建议您使用这个库Android NDK GIF库 --它比AnimatedGifEncoder好得多:

下面是一个完整的示例,说明如何生成GIF文件并将其保存到库中:

代码语言:javascript
复制
@SuppressLint("StaticFieldLeak")
    public class GenerateSaveGIF extends AsyncTask<Void, Integer, String> {
        Context mContext;
        String imageFileName = "APP_" + System.currentTimeMillis() + ".gif";
        ArrayList<BitmapGIFUtil> arrayListBitmaps = new ArrayList<>();
        boolean isSavingBitmapsFinished = false;

        GenerateSaveGIF(Context context) {
            mContext = context;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Preparing;
            // Display ProgressDialog here 
        }

        @SuppressLint("WrongThread")
        @Override
        protected String doInBackground(Void... voids) {
            File storageDir = new File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                            + "/APP_FOLDER");
            boolean success = true;
            if (!storageDir.exists()) {
                success = storageDir.mkdirs();
            }
            if (success) {
                File imageFile = new File(storageDir, imageFileName);
                savedImagePath = imageFile.getAbsolutePath();
                FileOutputStream outStream = null;
                try {
                    generateGIF(getArrayBitmaps(), savedImagePath);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                galleryAddPic(savedImagePath);
            }
            return savedImagePath;
        }

        ArrayList<BitmapGIFUtil> getArrayBitmaps() {
            for (int i = 0; i < mDrawableGif.getNumberOfFrames(); ++i) {
                int GIFDelay = mDrawableGif.getFrameDuration(i); //CHANGE IT IF YOU WANT 
                try {
                    Thread.sleep(GIFDelay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //replace createEachFrame() with your method getBitmapFromResource(); 
                arrayListBitmaps.add(new BitmapGIFUtil(createEachFrame(), GIFDelay));
            }
            isSavingBitmapsFinished = true;
            return arrayListBitmaps;
        }

        void generateGIF(ArrayList<BitmapGIFUtil> arrayList, String path) {
            GifEncoder gifEncoder = new GifEncoder();
            try {
                gifEncoder.init(arrayList.get(0).getBitmap().getWidth(), arrayList.get(0).getBitmap().getHeight(), path, GifEncoder.EncodingType.ENCODING_TYPE_SIMPLE_FAST);
                for (int i = 0; i < arrayList.size(); i++) {
                    gifEncoder.encodeFrame(arrayList.get(i).getBitmap(), arrayList.get(i).getDelay());
                }
                gifEncoder.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(this, getResources().getString(R.string.gif_saved), Toast.LENGTH_SHORT).show();
        }
    }

通知库:

代码语言:javascript
复制
 private void galleryAddPic(String imagePath) {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(imagePath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        sendBroadcast(mediaScanIntent);
    } 

BitmapGIFUtil类:

代码语言:javascript
复制
    public class BitmapGIFUtil {
    private Bitmap bitmap;
    private int Delay;

    public BitmapGIFUtil() {
    }

    public BitmapGIFUtil(Bitmap bitmap, int delay) {

        this.bitmap = bitmap;
        Delay = delay;
    }

    public Bitmap getBitmap() {
        return bitmap;
    }

    public void setBitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public int getDelay() {
        return Delay;
    }

    public void setDelay(int delay) {
        Delay = delay;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59467502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档