Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.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
Android 摄影机预览始终返回320x240位图_Android_Bitmap_Android Camera - Fatal编程技术网

Android 摄影机预览始终返回320x240位图

Android 摄影机预览始终返回320x240位图,android,bitmap,android-camera,Android,Bitmap,Android Camera,我正在创建一个图像预览,我希望得到一个非常高的图片分辨率。然而,我不知道为什么,尽管Galaxy Nexus支持各种分辨率(我认为最大的分辨率是1920x1080,但我不记得这些是不是精确的值),但当我保存图片时,它说预览的信息是320x240 pixels.mCamera = getCameraInstance(); Camera.Parameters params = mCamera.getParameters(); List<Size> sizes = params.getSu

我正在创建一个图像预览,我希望得到一个非常高的图片分辨率。然而,我不知道为什么,尽管Galaxy Nexus支持各种分辨率(我认为最大的分辨率是1920x1080,但我不记得这些是不是精确的值),但当我保存图片时,它说预览的信息是320x240

pixels.mCamera = getCameraInstance();
Camera.Parameters params = mCamera.getParameters();
List<Size> sizes = params.getSupportedPreviewSizes();
Size biggestSize = sizes.get(0);
double biggestPixels = biggestSize.width + biggestSize.height;
for (Size size : sizes) {
    double pixels = size.width * size.height;
    if (pixels > biggestPixels) {
        biggestSize = size;
        biggestPixels = pixels;
    }
}
// At this point, biggestSize is 1920x1080
float ratio = ((float) biggestSize.width)
                    / ((float) biggestSize.height);
params.setPreviewSize(biggestSize.width, biggestSize.height);
mCamera.setParameters(params);
setCameraDisplayOrientation(this, 0, mCamera);
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
LinearLayout innerWrapper = (LinearLayout) findViewById(R.id.innerWrapper);
LayoutParams layoutParams = (LayoutParams) innerWrapper
                    .getLayoutParams();
layoutParams.height = (int) (layoutParams.height * ratio);
innerWrapper.setLayoutParams(layoutParams);
preview.addView(mPreview);

这与我用来保存预览的
FrameLayout
的布局尺寸有关吗?因为我把它定义为350x350 dp,而这个预览应该更大。

我真傻。问题是my
PictureCallback
实现为
jpeg
参数,而不是
raw
参数。其中,引用:

当原始图像数据可用时,会发生原始回调(注意: 如果没有原始图像回调缓冲区,则数据将为空 可用或原始图像回调缓冲区不够大,无法容纳 原始图像)。当一个已缩放的、完全 已处理的postview映像可用(注意:并非所有硬件支持 这个)。当压缩图像可用时,会发生jpeg回调


将整个
PictureCallback
移动到
mCamera.takePicture
的第二个参数,而不是第三个参数,可以解决此问题。但是,您需要一个
CallbackBuffer
来执行此操作,并更改代码以适应缓冲区的使用。因此,对于第一个版本,我将坚持使用低质量的图片。

愚蠢的我。问题是my
PictureCallback
实现为
jpeg
参数,而不是
raw
参数。其中,引用:

当原始图像数据可用时,会发生原始回调(注意: 如果没有原始图像回调缓冲区,则数据将为空 可用或原始图像回调缓冲区不够大,无法容纳 原始图像)。当一个已缩放的、完全 已处理的postview映像可用(注意:并非所有硬件支持 这个)。当压缩图像可用时,会发生jpeg回调

将整个
PictureCallback
移动到
mCamera.takePicture
的第二个参数,而不是第三个参数,可以解决此问题。但是,您需要一个
CallbackBuffer
来执行此操作,并更改代码以适应缓冲区的使用。因此,对于第一个版本,我将坚持低质量的图片

mCamera.autoFocus(new AutoFocusCallback() {

    @Override
    public void onAutoFocus(boolean success, Camera camera) {
        mCamera.takePicture(null, null, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 1;
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
                                            data.length, options);
                Bitmap finalBitmap;
                float ow = bitmap.getWidth();
                float oh = bitmap.getHeight();
                // At this point, ow and oh are 320 and 240
                float ratio = ow / oh;
                int fw, fh, x, y, angle;
                //It continues, but irrelevant
                ...