Как декодировать сырое растровое изображение в Android

Я должен декодировать строку в кодировке base64, которая содержит необработанный растровое изображение со следующими настройками:

  • Один бит цвета (черный, белый)
  • Размер: 106 х 56 пикселей (столбцы х строк)
  • Старт вверху слева (0,0) и спуск по вертикали
  • Один байт = 8 пикселей, которые расположены вертикально, то есть от (0,0) до (7,0)[!
  • Это составляет 7 байтов по вертикали и 106 столбцов по 7 байтов в каждом

Обзор строк кодировки столбцов

Как правильно декодировать изображение?

Идея состояла в том, чтобы декодировать растровое изображение столбец за столбцом и показывать его в виде прямоугольника (на самом деле это скорее вертикальная линия). Но декодирование работает только с целыми необработанными данными.

Это то, что я до сих пор.

public class MyBitmap extends View {

    private static final String TAG                          = MyBitmap.class.getSimpleName();

    Bitmap gRow;
    String base64String = "AABBSUk2AEAAYVFJRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAAAAAAAAAAAPCQkJCQkJCQkJCQkJCQ8AAAAAAAAP4iIiIiADBAgEAwAOCQkJDgAOAQEBAgAPAAAADwABD8EADyAPAgEBDgAOAQEBDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA8Hv//HjwwAAAAAICAhwgQEBCQkJAQEBAIh4CAAAAAAAAHBAQEBAAGAQABBgADBAQEAgADBAQEAgADBAQEAwAAAwQABwAHAAAABwAEBQUFAwAGBgAGBgAGBgAAAAAAAAAAAAAAAAAAAAAAAAB/fwAAAAAAAD9/9/f39/f39/f39/f39/f3fz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEDg////4MDAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4DC8HVwcvDPgAAAAAAAAAAADAICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAIAAAwAAA4AAAAAAAAAAAAAAAAIBAQEBAQEBAwAAAAAAAAAAAAAAAAAAAAAAA/wBVAFUAVQD/AAAAAAAAAAAAP0BAQEAAMklJSX4AfwIBAX4APkFBQSIAPklJSS4AP0AAAAAAAB9gHGAfAH8AAT9BAH8BAQF+AAAAAAAEChEgQFFKREpRQH8AAAAAAAAAAAAAAAAAAAAAAAEDB/7+/gcDAQAAAAAAAAAAAA==";
    private int COLUMNS = 106;
    private  int PIXELS_IN_ROW = 56;
    private  int PIXELS_IN_COLUMN = COLUMNS;
    private int BYTES_IN_ROW = 7;

    public MyBitmap (Context context) {
        super(context);

    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
        byte[] decodedString = Base64.decode(base64String, Base64.DEFAULT);

        int X_OFFSET = canvas.getWidth()/2 - COLUMNS/2;
        int Y_OFFSET = canvas.getHeight()/2 - PIXELS_IN_ROW/2;
        int SCALE = 3;

        gRow = BitmapFactory.decodeByteArray(decodedString,0, PIXELS_IN_ROW*PIXELS_IN_COLUMN/8);

        for (int x=0; x< COLUMNS; x++) {
//          for (int y=0; y < ROWS; y++) {
                if (gRow!= null) {
                    gRow = BitmapFactory.decodeByteArray(decodedString,0, PIXELS_IN_ROW*PIXELS_IN_COLUMN/8);

                    Rect srcRect = new Rect(X_OFFSET+x,Y_OFFSET,X_OFFSET+x,Y_OFFSET+PIXELS_IN_ROW);
                    Rect destRect = new Rect(X_OFFSET+x,Y_OFFSET,X_OFFSET+x*SCALE, Y_OFFSET+PIXELS_IN_ROW*SCALE);

                    canvas.drawBitmap(gRow,null,destRect,null);
                }else {
                    L.v(TAG, "The bitmap could not be decoded !!!");
                }

//          }
        }
    }
}

Результирующий вид выглядит как телевизионная картинка без настройки:-(На самом деле он должен показывать 5 строк с текстом, цифрами и значками.

Это как выглядит на телефоне

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

Любой указатель, как справиться с этим или, возможно, альтернативный лучший подход очень ценится.

0 ответов

Другие вопросы по тегам