BitmapFactory.decodeByteArray() 始终返回 null(手动创建的字节数组)
Posted
技术标签:
【中文标题】BitmapFactory.decodeByteArray() 始终返回 null(手动创建的字节数组)【英文标题】:BitmapFactory.decodeByteArray() always returns null (manually-created byte array) 【发布时间】:2016-07-22 11:58:26 【问题描述】:所以我试图从一位同事那里移植一些 C++ 代码,该同事通过蓝牙串行端口获取图像数据(我使用的是 android 手机)。我需要根据数据生成位图。
在测试移植的代码之前,我写了这个快速函数来大概生成一个纯红色的矩形。但是,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");
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
有人有什么想法吗?
【问题讨论】:
From the data I will need to generate a bitmap.
。您收到什么类型的数据?如果您收到 .png 或 .jpg 之类的图像文件,您的方法是错误的。
抓取算法相对复杂,但基本上我收到的是 3 字节形式的像素的 RGB 数据 - 但是由于硬件实现,数据进入的顺序不是连续的像素
【参考方案1】:
decodeByteArray
of BitmapFactory
实际上解码图像,即已以 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);
【讨论】:
无法在 byte[] 和 int[] 之间转换 @CyberFox 一直以来,您是第一个注意到错字的人。固定。以上是关于BitmapFactory.decodeByteArray() 始终返回 null(手动创建的字节数组)的主要内容,如果未能解决你的问题,请参考以下文章