将图像数据RAW到Android Bitmap

时间:2016-05-10 17:55:02

标签: java android image networking bitmap

我一直致力于扩展当前的应用程序,以便将网络摄像头数据流式传输到Android设备。我可以以RGB字节数组的形式获得原始图像数据。颜色空间是sRGB。我需要通过网络将该阵列发送到Android客户端,后者将其构建为Bitmap图像以显示在屏幕上。我的问题是颜色数据是偏斜的。数组在发送之前和之后具有相同的哈希码,所以我很肯定这不是数据丢失问题。我附上了sample image颜色的外观,你可以看到肤色和深色重建好了,但较浅的颜色最终会产生很多黄色/红色的瑕疵。

服务器(Windows 10)代码:

while(socket.isConnected()) {


        byte[] bufferArray = new byte[width * height * 3];

        ByteBuffer buff = cam.getImageBytes();

        for(int i = 0; i < bufferArray.length; i++) {

            bufferArray[i] = buff.get();

        }

        out.write(bufferArray);
        out.flush();

    }

客户端(Android)代码:

while(socket.isConnected()) {

            int[] colors = new int[width * height];
            byte[] pixels = new byte[(width * height) * 3];

            int bytesRead = 0;
            for(int i = 0; i < (width * height * 3); i++) {
                int temp = in.read();
                if(temp == -1) {
                    Log.d("WARNING", "Problem reading");
                    break;
                }
                else {
                    pixels[i] = (byte) temp;
                    bytesRead++;
                }
            }

            int colorIndex = 0;
            for(int i = 0; i < pixels.length; i += 3 ) {

                int r = pixels[i];
                int g = pixels[i + 1];
                int b = pixels[i + 2];

                colors[colorIndex] = Color.rgb( r, g, b);
                colorIndex++;
            }

            Bitmap image = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
            publishProgress(image);

        }

cam.getImageBytes()来自外部库,但我测试了它并且它正常工作。使用代码

将RAW数据重建为BufferedImage可以完美地工作
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
image.getRaster().setPixels(0,0,width,height, pixels);

但是,当然,Android上不支持BufferedImages。

我准备用这个撕掉我的头发,我已经尝试了我能想到的一切,所以任何和所有见解都会非常有用!

0 个答案:

没有答案