java - float 组到字节数组,用于在 android 中的 Canvas 上显示位图

标签 java android bitmap floating-point arrays

我在 java 中有一个 float 数组,想将每个元素转换为其对应的字节数组以使用 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) & MASK);
    }
    return result;
}




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 位数组表示形式,但是为此我首先将其转换为原始 int,然后再转换为 byte[]。我不确定这是否是最好的方法。但是最后我希望构建一个计算出的音轨对数频谱振幅的浮点矩阵并将该矩阵映射到位图。但是,我坚持只将单个数组转换为位图。我是 android 和 java 的新手。如果人们可能会建议使用另一种方法来执行此任务,那就太好了。谢谢。

最佳答案

BitmapFactory.decodeByteArray (byte_array,..) 期望 byte_array 是“压缩图像数据的字节数组”。我怀疑一些任意字节构成了压缩图像。也许您应该重复调用 Canvas.drawPoint()?

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

在这里,您将 byte_array 设置为构成第二个 int(int_array[1]) 的 4 个字节。并这样做 16 次。

将 float 组转换为字节数组可以更容易地完成:(未测试)

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

但是,除非您确切地知道自己看到的是什么,否则将其转换为图像看起来会像时髦的随机颜色。生成从白色到黑色的颜色不是更有意义吗?

关于java - float 组到字节数组,用于在 android 中的 Canvas 上显示位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5961669/

相关文章:

java - 修改一个Bitmap后,如何修改 "modified"Bitmap等?

c++ - 组合位图 - GDI/GDI+?

c++ - 创建和显示位图

java - 何时以及为何使用或等于 (|=) 速记运算符

java - 在 Android 应用程序中读取 10mb 大文本文件

android - CursorAdapter.swapCursor 第一次没有刷新

android - relativelayout、include 和layout_alignParentBottom 不起作用

java web 启动 JAVA_HOME

java - 关闭 ServerSocket - 如何正确检查客户端套接字是否已关闭?

android - 有没有办法在 Home Widget 上制作动画?