Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android预览相机返回不完整的数据数组_Java_Android_Camera - Fatal编程技术网

Java Android预览相机返回不完整的数据数组

Java Android预览相机返回不完整的数据数组,java,android,camera,Java,Android,Camera,我正在尝试对Android预览相机通过onPreviewFrame返回的图像进行一些图像处理。这在尺寸高达1080×720的情况下工作良好,但我试图将分辨率提高到1920×1080。结果是我最终得到的数据不完整,尝试处理每个像素会导致ArrayIndexOutOfBounds异常 1920 x 1080图像的数据有2073600像素,但无论图像分辨率如何,onPreviewFrame返回的数据[]似乎总是大小为1382400 params.setPreviewSize(1920, 1080);

我正在尝试对Android预览相机通过onPreviewFrame返回的图像进行一些图像处理。这在尺寸高达1080×720的情况下工作良好,但我试图将分辨率提高到1920×1080。结果是我最终得到的数据不完整,尝试处理每个像素会导致ArrayIndexOutOfBounds异常

1920 x 1080图像的数据有2073600像素,但无论图像分辨率如何,onPreviewFrame返回的数据[]似乎总是大小为1382400

params.setPreviewSize(1920, 1080);

mCamera.setPreviewCallback(new Camera.PreviewCallback() {
        public synchronized void onPreviewFrame(byte[] data, Camera camera) {
            changeMag = 0;
            thisDiff = 0;
            diffPixels = 0;
            try {
                if (currentImage != null) {
                    lastImage = currentImage;
                }
                Log.e("CameraTest", "Incoming data array size is only " + data.length);
}
无论我选择的预览大小如何,此日志记录“传入数据数组大小仅为1382400”


假设1920 x 1080是一个受支持的大小,有没有办法通过onPreviewFrame返回该数据?

显然,1920x1080不受支持。如果getSupportedPreviewSizes()列表中确实包含此解析,则这将不是第一次出现设备报告不正确的情况。例如,Galaxy Nexus声称支持QVGA(320x240)预览,但它无法提供这样的图像。setPreviewSize()+setParameters()将正确继续,甚至getPreviewSize()也会报告预期值。但是预览回调返回的图像大小与设置此分辨率之前的大小相同

params.setPreviewSize(1920, 1080);

mCamera.setPreviewCallback(new Camera.PreviewCallback() {
        public synchronized void onPreviewFrame(byte[] data, Camera camera) {
            changeMag = 0;
            thisDiff = 0;
            diffPixels = 0;
            try {
                if (currentImage != null) {
                    lastImage = currentImage;
                }
                Log.e("CameraTest", "Incoming data array size is only " + data.length);
}
所以,我希望你真的收到一张1280x720的图片,对此无能为力


请注意,在该设备上可能仍然可以录制1920x1080视频:录像机可能使用一种特殊的机制,该机制涉及硬件编码器,并且通常将摄像机数据发送到此编码器,而无需将其复制到用户空间。

谢谢。我想到了两个后续问题。第一,您是如何发现1920不受支持的?我找不到外部列表,设备确实将其报告为受支持。第二,您是否知道如何更改数据[]的返回大小或以其他方式恢复它?令我惊讶的是,我似乎没有得到更小的图像格式。取而代之的是,我得到了数据[]所能容纳的1920x1080个数据,其余的都被丢弃了。我意识到这可能是不可能的,但我被这样的分辨率拍摄的图像所吸引。确定设备X支持分辨率Y的过程非常简单:尝试设置分辨率Y,如果您在回调中获得预期的数据,那么答案是肯定的;否则-否定。你就是这么做的。顺便说一句,您如何知道您获得的1920x1080数据是数据[]所能容纳的最大数量?你使用了哪种预览格式。不,这个尺寸你无法控制。无论如何,我们已经进入了一个未知的领域,这个系统的摄像头服务有缺陷,所以任何事情都有可能发生。例如,使用稍微不同的流可能会有所不同。这是一个老问题,但我会在将来为任何好奇的人更新。我知道图像的理论大小大于数据的最大大小[]。无效图像似乎有1.5个颜色通道(全亮度,加上一个“撕裂”的色度通道,其中图像的一部分是不完全着色的)。至于在设备屏幕上显示预览,尽管保存的版本已损坏,但它不会通过数据[],并且图像是正确的。