Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BitmapFactory.decodeByteArray()始终返回null(手动创建的字节数组) 我试图从一个同事那里移植一些C++代码,通过BLUTETOS串口获取图像数据(我使用的是Android手机)。根据这些数据,我需要生成一个位图_Java_Android_Bitmap_Skia - Fatal编程技术网

Java BitmapFactory.decodeByteArray()始终返回null(手动创建的字节数组) 我试图从一个同事那里移植一些C++代码,通过BLUTETOS串口获取图像数据(我使用的是Android手机)。根据这些数据,我需要生成一个位图

Java BitmapFactory.decodeByteArray()始终返回null(手动创建的字节数组) 我试图从一个同事那里移植一些C++代码,通过BLUTETOS串口获取图像数据(我使用的是Android手机)。根据这些数据,我需要生成一个位图,java,android,bitmap,skia,Java,Android,Bitmap,Skia,在测试移植代码之前,我编写了这个快速函数来生成一个纯红色矩形。但是,BitmapFactory.decodeByteArray()总是失败并返回空位图。我已经检查了它可以抛出的两个可能的例外,但没有一个例外被抛出 byte[] pixelData = new byte[225*160*4]; for(int i = 0; i < 225*160; i++) { pixelData[i * 4 + 0] = (byte)

在测试移植代码之前,我编写了这个快速函数来生成一个纯红色矩形。但是,BitmapFactory.decodeByteArray()总是失败并返回空位图。我已经检查了它可以抛出的两个可能的例外,但没有一个例外被抛出

byte[] pixelData = new byte[225*160*4];
                for(int i = 0; i < 225*160; i++) {
                    pixelData[i * 4 + 0] = (byte)255;
                    pixelData[i * 4 + 1] = (byte)255;
                    pixelData[i * 4 + 2] = (byte)0;
                    pixelData[i * 4 + 3] = (byte)0;
                }
                Bitmap image = null;
                logBox.append("Creating bitmap from pixel data...\n");
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                options.outWidth = 225;
                options.outHeight = 160;

                try {
                    image = BitmapFactory.decodeByteArray(pixelData, 0, pixelData.length, options);
                } catch (IllegalArgumentException e) {
                    logBox.append(e.toString() + '\n');
                }
                //pixelData = null;
                logBox.append("Bitmap generation complete\n");
byte[]pixelData=新字节[225*160*4];
对于(int i=0;i<225*160;i++){
像素数据[i*4+0]=(字节)255;
像素数据[i*4+1]=(字节)255;
像素数据[i*4+2]=(字节)0;
像素数据[i*4+3]=(字节)0;
}
位图图像=空;
附加(“从像素数据创建位图…\n”);
BitmapFactory.Options=new-BitmapFactory.Options();
options.inPreferredConfig=Bitmap.Config.ARGB_8888;
options.outWidth=225;
options.outHeight=160;
试一试{
image=BitmapFactory.decodeByteArray(pixelData,0,pixelData.length,选项);
}捕获(IllegalArgumentException e){
append(例如toString()+'\n');
}
//pixelData=null;
logBox.append(“位图生成完成\n”);
decodeByteArray()代码:

公共静态位图解码字节数组(字节[]数据、整数偏移量、整数长度、选项选项){
if((偏移量|长度)<0 | | data.length
我认为失败的是nativeDecodeByteArray()

我还注意到日志消息:

D/skia:---SkImageDecoder::工厂返回null


有人有什么想法吗?
BitmapFactory
decodeByteArray
实际上解码了一幅图像,即以JPEG或PNG等格式编码的图像
decodeFile
decodeStream
更有意义,因为您的编码图像可能来自文件、服务器或其他地方

你不想破译任何东西。您正在尝试将原始图像数据转换为位图。查看您的代码,您似乎正在生成一个225 x 160位图,每像素4字节,格式为ARGB。因此,此代码应该适用于您:

    int width = 225;
    int height = 160;
    int size = width * height;
    int[] pixelData = new int[size];
    for (int i = 0; i < size; i++) {
        // pack 4 bytes into int for ARGB_8888
        pixelData[i] = ((0xFF & (byte)255) << 24) // alpha, 8 bits
                | ((0xFF & (byte)255) << 16)      // red, 8 bits
                | ((0xFF & (byte)0) << 8)         // green, 8 bits
                | (0xFF & (byte)0);               // blue, 8 bits
    }

    Bitmap image = Bitmap.createBitmap(pixelData, width, height, Bitmap.Config.ARGB_8888);
int-width=225;
内部高度=160;
整数大小=宽度*高度;
int[]pixelData=新int[size];
对于(int i=0;i像素数据[i]=((0xFF&(字节)255)
我需要从数据中生成位图。
。你会收到什么类型的数据?如果你收到.png或.jpg这样的图像文件,你的方法是错误的。抓取算法相对复杂,但我收到的基本上是3字节形式的像素RGB数据-但是数据的顺序不是连续的由于硬件实现,像素一直无法在byte[]到int[]@CyberFox之间转换,您是第一个注意到输入错误的人。已修复。
    int width = 225;
    int height = 160;
    int size = width * height;
    int[] pixelData = new int[size];
    for (int i = 0; i < size; i++) {
        // pack 4 bytes into int for ARGB_8888
        pixelData[i] = ((0xFF & (byte)255) << 24) // alpha, 8 bits
                | ((0xFF & (byte)255) << 16)      // red, 8 bits
                | ((0xFF & (byte)0) << 8)         // green, 8 bits
                | (0xFF & (byte)0);               // blue, 8 bits
    }

    Bitmap image = Bitmap.createBitmap(pixelData, width, height, Bitmap.Config.ARGB_8888);