您正在开发Android上的实时图像处理应用程序。我正在使用PreviewCallback在每一帧中获取图像。当我在Tablet设备中获取数据时,数据返回非常大。因此,实时处理大数据太难了。 我的问题是,有没有办法从相机预览中获得较小的分辨率数据。
相机预览代码:
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
Camera.Parameters params = camera.getParameters();
Log.v("image format", Integer.toString(params.getPreviewFormat()));
//Frame captureing via frameManager
frameManager.initCamFrame(params.getPreviewSize().width, params.getPreviewSize().height,
data);
}
});
答案 0 :(得分:0)
您是否知道可以通过拨打getSupportedPreviewSizes()
从相机参数中获取支持的预览尺寸列表?我尝试过的所有设备都返回了一个排序列表,尽管有时会按升序排列,有时会按降序排列。您可能希望手动迭代列表以找到“最小”预览大小,或者先将其排序并抓取第一个项目。
答案 1 :(得分:0)
您可以调用参数。setPreviewSize(宽度,高度),但您希望在相机预览开始之前执行此操作。而且您需要使用支持的值,即之前的答案。
你也不应该每帧调用camera.getParameters(),只需执行一次并将值保存到某个变量。你在onPreviewFrame上的时间有限,因为每个帧都会覆盖byte []数据,所以尽量只做重要的事情。
您应该使用setPreviewCallbackWithBuffer,这会大大提高效果 - 请检查this post。
答案 2 :(得分:0)
你可以试试这个:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
try {
byte[] baos = convertYuvToJpeg(data, camera);
StringBuilder dataBuilder = new StringBuilder();
dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
mSocket.emit("newFrame", dataBuilder.toString());
} catch (Exception e) {
Log.d("########", "ERROR");
}
}
};
public byte[] convertYuvToJpeg(byte[] data, Camera camera) {
YuvImage image = new YuvImage(data, ImageFormat.NV21,
camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int quality = 20; //set quality
image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality
return baos.toByteArray();
}