Байт байта Android для Bitmap Как сделать

Как преобразовать байтовый массив, полученный с помощью сокета.

  1. Клиент C ++ отправляет данные изображения, которые имеют тип uchar.

  2. На стороне андроида я получаю этот массив uchar как byte [], который колеблется от -128 до +127.

То, что я хотел сделать, это получение этих данных и их отображение. Для этого я пытался конвертировать в Bitmap с помощью BitmapFactory.decodeByteArray() , но мне не повезло, что я получаю нулевой битмап. Имею ли я право или любой другой доступный метод.

Заранее спасибо….

Я использовал его, как показано ниже, в одном из моих проектов, и до сих пор он был довольно прочным. Я не уверен, насколько это придирчиво, насколько это не сжато, как PNG.

 byte[] bytesImage; Bitmap bmpOld; // Contains original Bitmap Bitmap bmpNew; ByteArrayOutputStream baoStream = new ByteArrayOutputStream(); bmpOld.compress(Bitmap.CompressFormat.PNG, 100, baoStream); bytesImage = baoStream.toByteArray(); bmpNew = BitmapFactory.decodeByteArray(bytesImage, 0, bytesImage.length); 

Edit: Я адаптировал код из этого сообщения, чтобы использовать RGB, поэтому приведенный ниже код должен работать на вас. У меня еще не было возможности проверить его, поэтому ему может потребоваться некоторая корректировка.

 Byte[] bytesImage = {0,1,2, 0,1,2, 0,1,2, 0,1,2}; int intByteCount = bytesImage.length; int[] intColors = new int[intByteCount / 3]; int intWidth = 2; int intHeight = 2; final int intAlpha = 255; if ((intByteCount / 3) != (intWidth * intHeight)) { throw new ArrayStoreException(); } for (int intIndex = 0; intIndex < intByteCount - 2; intIndex = intIndex + 3) { intColors[intIndex / 3] = (intAlpha << 24) | (bytesImage[intIndex] << 16) | (bytesImage[intIndex + 1] << 8) | bytesImage[intIndex + 2]; } Bitmap bmpImage = Bitmap.createBitmap(intColors, intWidth, intHeight, Bitmap.Config.ARGB_8888); 

Из комментариев к приведенным выше ответам кажется, что вы хотите создать объект Bitmap из потока значений RGB, а не из любого формата изображения, такого как PNG или JPEG.

Вероятно, это означает, что вы уже знаете размер изображения. В этом случае вы можете сделать что-то вроде этого:

 byte[] rgbData = ... // From your server int nrOfPixels = rgbData.length / 3; // Three bytes per pixel. int pixels[] = new int[nrOfPixels]; for(int i = 0; i < nrOfPixels; i++) { int r = data[3*i]; int g = data[3*i + 1]; int b = data[3*i + 2]; pixels[i] = Color.rgb(r,g,b); } Bitmap bitmap = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888); 
 InputStream is = new java.net.URL(urldisplay).openStream(); byte[] colors = IOUtils.toByteArray(is); int nrOfPixels = colors.length / 3; // Three bytes per pixel. int pixels[] = new int[nrOfPixels]; for(int i = 0; i < nrOfPixels; i++) { int r = (int)(0xFF & colors[3*i]); int g = (int)(0xFF & colors[3*i+1]); int b = (int)(0xFF & colors[3*i+2]); pixels[i] = Color.rgb(r,g,b); } imageBitmap = Bitmap.createBitmap(pixels, width, height,Bitmap.Config.ARGB_4444); bmImage.setImageBitmap(imageBitmap );