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

时间:2016-07-22 11:58:27

标签: java android bitmap skia

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

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

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

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

decodeByteArray的{​​{1}} <{1}}实际上解码图像,即已经以JPEG或PNG格式编码的图像。 BitmapFactorydecodeFile更有意义,因为您的编码图像可能来自文件或服务器或其他内容。

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

decodeStream