在SurfaceView中将图像保存到文件中的Canvas

3

根据我在SO上看到的内容,我想要做的事情即使可能也很困难,但我希望有人至少能建议一个更直接的方法来完成我想要的事情。以下代码在自定义SurfaceView中绘制了项目,全部都在画布上。我想要做的是,在显示画布的同时,将其上的所有内容保存到文件中,以供几个活动使用,但我似乎无法找到如何实现。

public void draw()
{
    if(holder.getSurface().isValid()) {
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(0, Mode.CLEAR);
        drawSurface(canvas);
        canvas.translate(-56, 30);
        int i = 0;
        for(Picture a: accessories) {
            canvas.translate(0, a_offset[i]);
            if(a!=null) {
                canvas.drawPicture(a);
            }
            i++;
        }           
        holder.unlockCanvasAndPost(canvas);  
    }
}

private void drawSurface(Canvas canvas) {
    Rect rect = new Rect();
    rect.set(37*screenWidth/480, 146*screenHeight/800, (37 + 300)*screenWidth/480, (146 + 300)*screenHeight/800);
    canvas.drawBitmap(avatar, null, rect, null);
}

我目前用来保存文件的方法本质上是使用上面的方法的副本,只不过使用了从位图创建的Canvas(canvas = new Canvas(bitmap) 而不是 holder.lockCanvas),并且使用不同的数字来获取正确的位置和大小。 我可以将这些方法组合起来,并至少给它们一些参数以避免使用不同的方法,但如果可能的话,我想只使用同一个画布绘制图像并保存文件。

1个回答

1

你不应该存储画布。你应该存储图像变换矩阵和图像本身。然后,如果你想要检索,加载图像,加载它的矩阵,将矩阵应用于图像,这样就可以了。

或者你可以尝试将画布对象本身作为 blob 数据存储,然后尝试使用 blob 从数据库中重新创建它。我从未这样做过,并且在任何情况下都不建议这样做。


抱歉,之前表述不够清晰——我不想存储画布,只需要存储图像(如果需要的话还有变换矩阵)。你能否提供更详细的步骤?使用lockCanvas创建的画布好像不容易实现这一点。 - hBrent
请查看此方法(getMatrix()),您可以在画布对象上调用它:http://developer.android.com/reference/android/graphics/Canvas.html#getMatrix() - Dhruv Gairola
这样看来,我已经得到了矩阵,但是我该如何存储我的图像呢?我只想要一个包含我在画布上绘制的所有内容的 PNG 图像。 - hBrent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接