Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中从JPEG创建动画GIF(开发)_Android_Animation_Jpeg_Adt_Gif - Fatal编程技术网

如何在Android中从JPEG创建动画GIF(开发)

如何在Android中从JPEG创建动画GIF(开发),android,animation,jpeg,adt,gif,Android,Animation,Jpeg,Adt,Gif,我正在寻找一种在本地Android应用程序中创建动画GIF的简单方法。 源文件应为JPEG(来自照相机或其他任何东西),输出应保存为设备上的GIF 我不想知道如何播放动画或动画GIF文件。 public class GifWebView extends View { private Movie mMovie; InputStream mStream; long mMoviestart; private boolean play; public GifWebVi

我正在寻找一种在本地Android应用程序中创建动画GIF的简单方法。 源文件应为JPEG(来自照相机或其他任何东西),输出应保存为设备上的GIF

我不想知道如何播放动画或动画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;
}
要清楚:我想知道如何将单个图像逐帧放入“电影”中,然后将其保存为.gif文件


e、 g.可以做我想做的事。

解决方案1

你看过这篇文章吗。。。。。这是源代码

据我所知,我认为android不会播放gif动画图像。您应该使用将播放gif动画的webview

如果可以的话

解决方案2


Android提供。

Gif基本上是一组帧中具有恒定时间延迟的图像。您不能在android中直接播放gif。我在android中播放gif动画方面做了很多工作

  • 在播放gif时,我们还处理所有播放帧的调用 自己所以这不是最好的方法

  • 如果您有一组图像,只需在帧中延迟播放它们。那个 这就是你想要的一切

  • 您也不能通过本机代码在应用程序中生成gif。有 使用gif格式也有一些缺点。这是我在比赛中遇到的

  • 如果您有一套绘图工具,也可以用来显示gif等动画。它还可以在任何视图中设置

我还制作了一个自定义视图来播放gif动画首先加载gif并将其转换为InputStream,然后将其传递给自定义视图类以播放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;
}

这可能对你有帮助。它是一个用来生成gif文件的类

请参阅此解决方案

这是这篇文章的Android版本

要使用此类,下面是一个生成GIF字节数组的示例帮助器方法。注意这里的getBitmapArray()函数是一种一次返回图像适配器中所有位图文件的方法。因此,输入是一个适配器中的所有位图文件,输出是一个可以写入文件的字节数组

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

如果只想将这些位图显示为动画gif,可以使用以下代码创建动画可绘制的

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

它做得很好,我,它创建文件速度快,质量好的图像

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

Hm。。。谢谢,但这只是玩GIF的方法。但是我想用我设备上的文件创建一个新的GIF文件。我想知道如何将单个图像逐帧转换为“电影”,然后将其另存为.gif文件。我没有在你的链接中找到类似的东西。还是我瞎了?:)你应该把这个解释放在原始问题的编辑中;)谢谢,但我没有问如何播放GIF文件。我问过如何创建GIF文件。有一种方法可以做你想做的事情。首先制作一个图像字节数组。然后添加gif文件的标题信息,然后保存这个文件。你有例子吗?我设法从字节数组保存了一个文件,但我不知道头信息。跟着这个。它包含gif所需的所有标题信息。或wiki git格式,并查找所有标题字节信息。然后在你的字节数组中添加这些值。这不是一个完美的答案,因为我没有一个有效的解决方案,但这是获得赏金的最接近的答案…谢谢:)我会尝试做同样的事情。用户3047840提出的这个问题的ans非常完美。这是用8位还是24位颜色计算gif?encoder.addFrame(位图);但是addFrame正在寻找图像路径对吗?类型AnimatedGifEncoder中的addFrame(image)方法不适用于参数(位图)@Achayan它应该将位图作为参数。有一个图像处理库,类似于使用Lifelogger提到的非常相同的AnimatedGifEncoder类,这对我来说非常缓慢。我的nexus 5x上的一帧大约6秒。每帧1800x1000是我的Android独立动画GIF书写器。它很快,您可以选择抖动以获得更好的质量。@dragon66您能添加一个发布标签以便我们使用JitPack吗?@TheRealChx101没有发布yet@dragon66制作一个:)这个编码器的一个特点是它可以一帧一帧地写入动画gif,以减少内存消耗。它也会保存gif文件吗?是的,它以名称animated.gif保存了gif