android - 来自 pictureTaken 的图像被拉伸(stretch)

标签 android camera

我使用在网上找到的代码设置了一个简单的相机应用程序。我已经对其进行了很多修改,直到它按我喜欢的方式工作。然而,它拍摄的图像由于某种原因最终被垂直拉伸(stretch),即使预览看起来不错。我在 galaxy nexus 上运行这个应用程序

这是使用内置相机应用程序拍摄时的样子:correct image

下面是我的应用程序的图像:stretched image

知道这是为什么吗?两个图像是相同的维度

提前致谢。我的代码在下面

public class CameraActivity extends Activity implements SurfaceHolder.Callback,
OnClickListener {
    private static final String TAG = "CameraTest";
    Camera mCamera;
    boolean mPreviewRunning = false;


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        Log.i(TAG, "onCreate");


        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.surface_camera);
        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        mSurfaceView.setOnClickListener(this);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

    Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {

            if (imageData != null) {

                handleJPEGData(imageData);
                mCamera.startPreview();



            }
        }
    };

    Camera.PictureCallback mRawCallback = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inPreferQualityOverSpeed = true;
            opts.inPreferredConfig = Bitmap.Config.RGB_565;
            Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, opts);

            Log.i(TAG, "Saving picture");

            MediaStore.Images.Media.insertImage(getContentResolver(), bmp, "1234", "124");
            Log.i(TAG, "Picture Saved");

        }
    };

    private void handleJPEGData(byte[] data) {
        Log.i(TAG, "Saving picture");
        ContentValues vals = new ContentValues();
        vals.put(Images.Media.DATE_TAKEN, new Date().getTime());
        vals.put(Images.Media.DATE_ADDED, new Date().getTime());
        vals.put(Images.Media.MIME_TYPE, "images/jpeg");
//        vals.put(Images.Media., value)
        Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());

        OutputStream imageFileOS;
        try {
            imageFileOS = getContentResolver().openOutputStream(uriTarget);
            imageFileOS.write(data);
            imageFileOS.flush();
            imageFileOS.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.i(TAG, "Picture Saved");

        mRawCallback.onPictureTaken(data, mCamera);
    }

    @Override
    protected void onResume() {
        Log.i(TAG, "onResume");
        super.onResume();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onStop() {
        Log.i(TAG, "onStop");
        super.onStop();
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Log.i(TAG, "surfaceCreated");
        mCamera = Camera.open();

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Log.i(TAG, "surfaceChanged");

        // XXX stopPreview() will crash if preview is not running
        if (mPreviewRunning) {
            mCamera.stopPreview();
        }

        Camera.Parameters p = mCamera.getParameters();
        p.setPreviewSize(1920, 1080);
        p.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO);
        p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        p.setJpegQuality(100);
        p.setPictureFormat(ImageFormat.JPEG);
        p.setPictureSize(2592,1944);
        mCamera.setParameters(p);



        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mCamera.startPreview();
        mPreviewRunning = true;
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.i(TAG, "surfaceDestroyed");
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();
    }

    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    public void onClick(View arg0) {

        mCamera.takePicture(null, null, mJpegCallback);

    }

}

最佳答案

想通了。这是因为预览尺寸与图片尺寸不同。这样做有点愚蠢,但确实如此。所以解决方案是使它们具有相同的纵横比。然而,在其他新闻中,这似乎已在 Jelly Bean 中修复

关于android - 来自 pictureTaken 的图像被拉伸(stretch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11535062/

相关文章:

android - 在不使用 setSpacing 的情况下防止图库图像重叠

android - 从 android 应用程序中完全删除 firebase 分析

ios - 如何获取原始 YUV420p 相机数据

android-layout - 以编程方式遵循 XML 的 Android TextView

Android特定的顺序流游戏算法?

Android: SQLite Constraint failed 问题

java - 安卓全屏摄像头

c# - 在 Wp7 中访问相机,带缩放

android - 释放相机 : "Method called after release()" exception

iphone - iOS 上的假长曝光