2016-07-22 1 views
1

Так что я пытаюсь передать некоторый код на C++ от коллеги, который захватывает данные изображения через последовательный порт Bluetoth (я пользуюсь телефоном Android). Из данных мне нужно будет создать растровое изображение.BitmapFactory.decodeByteArray() всегда возвращает null (созданный вручную массив байтов)

Перед тем, как тестировать портированный код, я написал эту быструю функцию для suposedly создать чистый красный прямоугольник. Однако 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 :: Фабрика возвращенное нуль

Кто есть какие-нибудь идеи?

+0

«Из данных мне нужно будет создать растровое изображение». Какие данные вы получаете? Если вы получаете файлы изображений, такие как .png или .jpg, ваш подход неверен. – greenapps

+0

Алгоритм захвата относительно сложный, но по существу то, что я получаю, это данные RGB для пикселей в виде 3 байтов. Однако порядок, в котором поступают данные, не является последовательным пикселем из-за аппаратной реализации. –

ответ

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); 
+0

Это работает отлично, спасибо! –

Смежные вопросы