我一直致力于扩展当前的应用程序,以便将网络摄像头数据流式传输到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。
我准备用这个撕掉我的头发,我已经尝试了我能想到的一切,所以任何和所有见解都会非常有用!