преобразование массива float в массив byte для отображения растрового изображения на canvas в Android

#java #android #bitmap #floating-point #bytearray

#java #Android #растровое изображение #с плавающей запятой #массивы

Вопрос:

У меня есть массив с плавающей запятой в Java, и я хочу преобразовать каждый элемент в его аналог в массиве байт для отображения с использованием android.graphics.Bitmap и Bitmapfactory, однако эта операция, похоже, не работает, были бы очень признательны за любые мудрые слова.

 package com.bitmapdisplay;
import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.View;
import android.view.Window;


public class BitmapDiplay extends Activity {
/** Called when the activity is first created. */
    float[] array = {1, 6, 1, 4, 5, 0, 8, 7, 8, 6, 1,0, 5 ,6, 1,8};
    float[] new_array= new float[array.length];
    int[] int_array;
    byte[] byte_array;
    private static final int MASK = 0xff;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);


    for(int k = 0;k<array.length;k  )
    {
        new_array[k] = (float)((double)array[k]*2);
        int_array[k] = Float.floatToRawIntBits(new_array[k]);
        byte_array = intToByteArray(int_array[1]);
        setContentView(new Panel(this));
    }

}



public static byte[] intToByteArray(int param) {
    byte[] result = new byte[4];
    for (int i = 0; i < 4; i  ) {
        int offset = (result.length - 1 - i) * 8;
        result[i] = (byte) ((param >>> offset) amp; MASK);
    }
    return resu<
}




class Panel extends View {
    public Panel(Context byteArray) {
        super(byteArray);
    }
    @Override
    public void onDraw(Canvas canvas) {
        Bitmap _scratch = BitmapFactory.decodeByteArray(byte_array, 0, byte_array.length);
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(_scratch, 10, 10, null);
    }
}
}
  

Я конвертирую из одного float в его 4-битное представление массива, однако для этого я сначала конвертирую его в raw int, а затем в byte[]. Я не уверен, что это лучший способ. Однако в конце я надеюсь построить матрицу с плавающей запятой из вычисленных логарифмических спектральных амплитуд звуковой дорожки и сопоставить матрицу с растровым изображением. Однако я застрял на простом преобразовании одного массива в растровое изображение. Я новичок в Android и Java. Если есть другой метод, который люди могли бы предложить для выполнения этой задачи, это было бы здорово.Спасибо.

Ответ №1:

BitmapFactory.decodeByteArray(byte_array, ..) ожидает, что byte_array будет «массивом байтов сжатых данных изображения». Я сомневаюсь, что некоторые произвольные байты составляют сжатое изображение. Может быть, вам следует повторно вызывать Canvas.drawPoint()?

 for(int k = 0;k < array.length;k  )
{
  ..
  byte_array = intToByteArray(int_array[1]);
  ..
}
  

Здесь вы устанавливаете byte_array равным 4 байтам, которые составляют второе значение int (int_array[1]). И сделайте это 16 раз.

Преобразование массива float в массив byte может быть выполнено проще: (не тестировал)

 float[] array = {1, 6, 1, 4, 5, 0, 8, 7, 8, 6, 1,0, 5 ,6, 1,8};
ByteBuffer byteBuf = ByteBuffer.allocate(4 * array.length);
FloatBuffer floatBuf = byteBuf.asFloatBuffer();
floatBuf.put(array);
byte [] byte_array = byteBuf.array();
  

Однако превращение этого в изображение будет выглядеть как фанковые случайные цвета, если вы точно не знаете, что видите. Не имеет ли больше смысла генерировать цвета от белого до черного?

Комментарии:

1. Да, переход от белого к черному будет иметь больше смысла или какая-то градиентная окраска, но на данном этапе я просто пытаюсь отобразить массив детскими шагами. Спасибо за вашу помощь, я попробую сегодня вечером. 🙂

2. @digiphd — Преобразование float в int проще, чем возиться с его байтовым представлением. Самый простой способ / шаги для отображения массива, вероятно, будут включать Canvas.drawPoint или drawRect . И установка Paint.setColor чего-то вроде Color.rgb( array[0]*255, array[0]*255, array[0]*255) .