BitmapFactory.decodeByteArray() всегда возвращает ноль (созданный вручную массив байтов)
Поэтому я пытаюсь перенести некоторый код C++ от коллеги, который получает данные изображения через последовательный порт Bluetoth (я использую телефон 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 вернул ноль
У кого-нибудь есть идеи?
1 ответ
decodeByteArray
из BitmapFactory
фактически декодирует изображение, то есть изображение, которое было закодировано в формате, таком как JPEG или PNG. decodeFile
а также decodeStream
иметь немного больше смысла, так как ваше закодированное изображение, вероятно, будет исходить из файла или сервера или чего-то еще.
Вы не хотите ничего декодировать. Вы пытаетесь получить необработанные данные изображения в растровое изображение. Глядя на ваш код, вы видите, что вы генерируете растровое изображение 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);