BitmapFactory.decodeByteArray()始终返回null(手动创建的字节数组)

所以我试图从同事那里获取一些C ++代码,这些代码通过Bluetoth串口抓取图像数据(我使用的是Android手机)。 从数据我需要生成一个位图。

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

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

decodeByteArray()代码:

 public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) { if ((offset | length) < 0 || data.length < offset + length) { throw new ArrayIndexOutOfBoundsException(); } Bitmap bm; Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap"); try { bm = nativeDecodeByteArray(data, offset, length, opts); if (bm == null && opts != null && opts.inBitmap != null) { throw new IllegalArgumentException("Problem decoding into existing bitmap"); } setDensityFromOptions(bm, opts); } finally { Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); } return bm; } 

我认为它的nativeDecodeByteArray()失败了。

我还注意到日志消息:

D / skia:— SkImageDecoder :: Factory返回null

有人有任何想法吗?

BitmapFactory decodeByteArray实际上解码图像,即已经以JPEG或PNG格式编码的图像。 decodeFiledecodeStream更有意义,因为您的编码图像可能来自文件或服务器或其他东西。

你不想解码任何东西。 您正在尝试将原始图像数据转换为位图。 看一下你的代码,看来你正在生成一个225 x 160位图,每个像素有4个字节,格式化为ARGB。 所以这段代码应该适合你:

  int width = 225; int height = 160; int size = width * height; int[] pixelData = new byte[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);