我正在尝试获取字节数组并从那里复制到另一个数组,使用 onPreviewFrame()
预览一些图片行。所以我准备了相机和新的字节数组
try {
if (cam != null) {
Camera.Parameters parameters = cam.getParameters();
parameters.setPreviewFrameRate(25);
parameters.setPictureFormat(ImageFormat.JPEG);
cam.setParameters(parameters);
cam.setPreviewDisplay(holder);
cam.startPreview();
arr = new byte[(parameters.getPreviewSize().height)
* (parameters.getPreviewSize().width)];
Log.i("" + parameters.getPictureSize().height, " "
+ parameters.getPictureSize().width);
}
} catch (IOException e) {
Log.d("CAMERA", e.getMessage());
}
日志告诉我:
480 640
所以 arr.length = 307200
但是:
public void onPreviewFrame(byte[] data, Camera camera) {
Log.i(arr.length+" ",data.length+"");
}
arr.length = 307200
(这当然意味着 Frame Size = 640*480)
但是
data.length = 460800
(这意味着帧大小 = 800*576)
当我尝试使用 System.arraycopy(data, 0, arr, 0, arr.length);
将数据复制到 Arr,然后导出图片时:
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream("/sdcard/new.jpg");
Camera.Parameters parameters = cam.getParameters();
Size size = parameters.getPreviewSize();
YuvImage image = new YuvImage(arr, parameters.getPreviewFormat(),
size.width, size.height, null);
image.compressToJpeg(
new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
outStream);
outStream.flush();
outStream.close();
} catch (FileNotFoundException e) {
Log.d("CAMERA", e.getMessage());
} catch (IOException e) {
Log.d("CAMERA", e.getMessage());
}
图片变绿:
那么我需要做什么才能使数据数组变成 640*480?或者,也许您知道另一种从(例如)Bitmap 获取单行并将其添加到另一个 Bitmap 的方法?
最佳答案
正确的数组大小是
new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()))/8];
(不同的格式有不同的bits-per-pixel值,用ImageFormat.getBitsPerPixel获取)
关于android - onPreviewFrame 返回错误的 byte[] 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991906/