【问题标题】:Canvas bitmap to byte array and reading it back trouble画布位图到字节数组并读回麻烦
【发布时间】:2012-02-22 18:34:53
【问题描述】:

我有一个画布,我正在尝试取出位图,将其转换为字节数组并将其序列化保存到文件中。然后稍后打开、反序列化并将位图应用回画布。在下面的代码中,除了将位图应用于画布时,一切似乎都运行良好。谁能告诉我哪里出错了。

public byte[] getCanvasData(){

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    mBitmap.compress(CompressFormat.PNG, 0, bos); 
    byte[] bitmapdata = bos.toByteArray();
    return bitmapdata;
}

public void setCanvasData(byte[] canvasData, int w, int h){
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mBitmap.eraseColor(0x00000000);
    mCanvas = new Canvas(mBitmap);
    mCanvas.drawBitmap(BitmapFactory.decodeByteArray(canvasData , 0,  canvasData.length).copy(Bitmap.Config.ARGB_8888, true), 0, 0, null);

}

添加了一些额外的代码可能会有所帮助

public void readInSerialisable() throws IOException
{
    FileInputStream fileIn = new FileInputStream("/sdcard/theBKup.ser");

    ObjectInputStream in = new ObjectInputStream(fileIn);


    try
    { 
       BookData book = (BookData) in.readObject();
       pages.clear();
       canvasContainer.removeAllViews();

       for (int i = 0; i < book.getBook().size(); i++){
           Log.d("CREATION", "LOADING PAGE " + i);
           pages.add(new Canvas2(context, book.getPageAt(i), canvasContainer.getWidth(), canvasContainer.getHeight()));
       }

       canvasContainer.addView(pages.get(page), new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.FILL_PARENT, AbsoluteLayout.LayoutParams.FILL_PARENT, 0, 0));

       updatePagination();
       Log.d("CREATION", "Updated Pagination");
    }
    catch (Exception exc)
    {
        System.out.println("didnt work");
        exc.printStackTrace();
    }
}

BookData - 包含我所有数据的可序列化类,其中包含简单的获取/设置

onDraw 方法

 @Override
protected void onDraw(Canvas canvas) {
    Log.d("DRAWING", "WE ARE DRAWING");
    canvas.drawColor(0x00AAAAAA); //MAKE CANVAS TRANSPARENT
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, mPaint);
}

【问题讨论】:

    标签: java android canvas bitmap bytearray


    【解决方案1】:

    我会做以下 2 个测试。

    1. 记录一些字节流以确保它被正确加载。像Log.v(canvasData[0]+canvasData[1]); 这样的东西,或者在那里设置一个断点,或者只是为了确保数据正确。
    2. 使用相同的代码绘制您知道有效的位图,并查看它是否正确显示。

    我不确定到底发生了什么,但我强烈怀疑以下情况之一。

    1. 未正确读入字节流。
    2. 位图没有更新到屏幕上,或者正在使用很小的尺寸。

    如果你的字节流数据有东西,那么你会想看看Canvas documentation.具体来说,看看下面的位。

    要查看 Canvas,必须将其放到视图中。一旦它在视图上,必须调用onDraw() 命令才能使其可见。我会确保您实际上正在执行 onDraw(),并且 Canvas 与 View 正确关联。如果您已经在使用 onDraw(),请发布与之相关的代码。

    【讨论】:

    • 首先感谢您的建议,结果是 Log.v(canvasData[0]+canvasData[1]);是-11980,我不确定这意味着什么......
    • @KamilSalagan:这意味着字节流至少是有效的,我认为是这样。看起来你的画布没有得到更新。将发布更多注释。
    • 嗯,这很有趣,至少我知道它很好,但是为什么画布没有更新?我在进程结束时调用了 invalidate() 方法,并且我知道 onDraw 被调用,我有一个 Log.v 可以将输出输出到控制台。
    • @KamilSalagan:在 onDraw() 代码以及调用 setCanvasData() 的位置发布该位。
    • 解决了这个问题,我是个笨蛋。原来我正在调用 onResize 方法并在应用我的位图后重新初始化画布和位图对象。感谢您的帮助。
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2012-09-29
    • 2014-02-03
    • 1970-01-01
    • 2023-02-06
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多