Мне нужно декодировать строку в кодировке base64, которая содержит необработанное растровое изображение со следующими настройками:
- Цвет в один бит (черный, белый)
- Размер: 106 x 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линии с текстом, цифрами и значками.
Есть ли способ, который позволил бы мне рисовать по крупицам? Он не предпочитает, но сейчас я несм. любые другие варианты.
Любой указатель, как с этим справиться, или, может быть, альтернативный лучший подход приветствуется.