Как декодировать сырое растровое изображение в Android - PullRequest
0 голосов
/ 19 декабря 2018

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

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

Overview rows an columns encoding

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

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

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

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линии с текстом, цифрами и значками.

This is how to looks like on the phone

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...