1

我让我的 SurfaceView 启动并运行,一个按钮可以打开相机并拍摄一张用作背景的照片,另一个按钮可以添加位于顶部并且可以移动的项目。这一切都很好,直到我尝试将 SurfaceView 保存为位图,而我得到的只是背景而顶部没有图像。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if(_mGotImage){

        canvas.drawBitmap(_mImage, 0, 0, null);
    }else{

            canvas.drawColor(Color.BLACK);
    }

    //if the array is not empty
    if(!_mJazzItems.isEmpty()){

        //step through each item in the array
        for(JazzItem item: _mJazzItems){

            //get the bitmap it is using
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), item.getBitmap());
            //and draw that bitmap at its X and Y coords
            canvas.drawBitmap(bitmap, item.getX(), item.getY(), null);

        }
    }
}

这是为尝试保存画布而调用的方法。

    public void screenGrab(){

    Bitmap image = Bitmap.createBitmap(_mPanelWidth, _mPanelHeight, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(image);
    this.onDraw(canvas);

    String path=Environment.getExternalStorageDirectory() + "/test2.png";
    File file = new File(path);

    try{

        file.createNewFile();
        FileOutputStream ostream = new FileOutputStream(file);
        image.compress(CompressFormat.PNG, 100, ostream);
        ostream.flush();
        ostream.close();

    }catch (Exception e){

        e.printStackTrace();
    }
}

onDraw 工作正常,我在后台拍摄我的相机,可以将我所有的项目添加到顶部并移动它们。就在我尝试截屏时,顶部的项目都不存在。

谢谢你的帮助!!

- 更新 -

我已将屏幕抓取方法修改为:

    public void screenGrab(){

    Bitmap image = Bitmap.createBitmap(_mPanelWidth, _mPanelHeight, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(image);

    canvas.drawBitmap(_mImage, 0, 0, null);

    //if the array is not empty
    if(!_mJazzItems.isEmpty()){

        //step through each item in the array
        for(JazzItem item: _mJazzItems){

            //get the bitmap it is using
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), item.getBitmap());
            //and draw that bitmap at its X and Y coords
            canvas.drawBitmap(bitmap, item.getX(), item.getY(), null);

        }
    }

    String path=Environment.getExternalStorageDirectory() + "/test2.png";
    File file = new File(path);

    try{

        file.createNewFile();
        FileOutputStream ostream = new FileOutputStream(file);
        image.compress(CompressFormat.PNG, 100, ostream);
        ostream.flush();
        ostream.close();

    }catch (Exception e){

        e.printStackTrace();
    }
}

我不明白为什么这没有在顶部绘制其他图像......

4

1 回答 1

1

就我而言,我正在使用这个:

public static Bitmap combineImages(Bitmap c, Bitmap overLayImage, Context con) {
    Bitmap cs = null;
    int width, height = 0;
    width     = c.getWidth();
    height     = c.getHeight();
    cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas comboImage = new Canvas(cs);
    comboImage.drawBitmap(c, 0, 0, null);
    String left = yourleftPosition;
    String top = yourtopPosition;

    comboImage.drawBitmap(overLayImage, Float.parseFloat(left), Float.parseFloat(top),null);
    /******
    *
    * Write file to SDCard
    *
    * ****/
    String tmpImg = String.valueOf(System.currentTimeMillis()) + ".png";
    OutputStream os = null;
    try {
        String pathis = Environment.getExternalStorageDirectory()
        + "/DCIM/Camera/" + tmpImg;
        os = new FileOutputStream(pathis);
        cs.compress(CompressFormat.PNG, 100, os);
    }
    catch (IOException e) {
        Log.e("combineImages", "problem combining images", e);
    }
    return cs;
}
于 2012-05-24T10:33:20.933 回答