Холст растровое изображение в байтовом массиве и проблемы с чтением обратно - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть холст, на котором я рисую, я пытаюсь извлечь растровое изображение, преобразовать его в байтовый массив и сохранить его сериализованным в файл.затем откройте, десериализуйте и примените растровое изображение обратно к холсту.В приведенном ниже коде все работает хорошо, за исключением того, что при применении растрового изображения к холсту ничего не появляется.Может кто-то, пожалуйста, покажите мне, где я иду не так.

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

1 Ответ

1 голос
/ 22 февраля 2012

Я бы сделал следующие 2 теста.

  1. Записать часть потока байтов, чтобы убедиться, что он был загружен правильно. Что-то вроде Log.v(canvasData[0]+canvasData[1]);, или поставить точку останова, или просто чтобы убедиться, что данные верны.
  2. Нарисуйте правильное растровое изображение, используя тот же код, и посмотрите, правильно ли оно выглядит.

Я не совсем уверен, что происходит, но я сильно подозреваю, что одно из следующего.

  1. Поток байтов не читается правильно.
  2. Растровое изображение не обновляется на экране или использует очень маленький размер.

Если в данных вашего байтового потока есть что-то, вам нужно взглянуть на документацию Canvas. В частности, посмотрите на следующий бит.

Чтобы увидеть холст, его нужно поставить на вид. Когда он находится в представлении, для его отображения должна быть вызвана команда onDraw(). Я хотел бы убедиться, что вы на самом деле делаете onDraw (), и что Canvas правильно связан с View. Если вы уже используете onDraw (), пожалуйста, опубликуйте биты кода, связанные с ним.

...