【问题标题】:SurfaceView image taken different than shownSurfaceView 拍摄的图像与显示的不同
【发布时间】:2011-12-07 03:29:56
【问题描述】:

我创建了一个布局,其中我的表面视图已从“原始大小”调整大小,我执行了以下操作:

    ViewGroup.LayoutParams params = mSurfaceView.getLayoutParams();
    int mPixels=getResources().getDimensionPixelSize(R.dimen.profile_pic_dimension); //200
    params.width=mPixels;
    params.height=mPixels;
    mSurfaceView.setLayoutParams(params);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

我得到这样的视图: http://img412.imageshack.us/img412/9379/layoutp.png

但是..每当我拍照时..它不会保存为我在视图上看到它的方式...而是保存它的正常大小,就像视图占据整个屏幕一样(比如表面视图从未调整大小)。

我试过用这个:

Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
    @Override
    public void onShutter() {
        Camera.Parameters p = mCamera.getParameters(); 
                p.setPictureSize(mSurfaceView.getWidth(), mSurfaceView.getHeight()); 
               mCamera.setParameters(p); 
        }
    };

但仍然没有得到我想要的图像尺寸。

【问题讨论】:

    标签: android android-layout surfaceview android-camera


    【解决方案1】:

    在设置图片(或预览)大小时,您不能只提供任何宽度和高度值。相反,您必须使用受支持尺寸列表中的一项,您可以通过调用 getSupportedPictureSizes() 来检索它(预览版有等效项)。

    到目前为止我还没有遇到任何支持拍摄方形照片的设备,所以在拍摄了 4:3、16:9、16:10 或任何比例的照片后,你将不得不“剪切”自己制作相关部分,并可选择将其缩小到特定尺寸。可能最直接的方法是创建一个new Bitmap as a subset from a source Bitmap(然后可以选择缩小它)。为了获得源位图,您可能需要使用takePicture(...) 将PictureCallback 连接到相机。

    【讨论】:

    • 亲爱的@MH。我找不到一种方法来确定未在预览中显示但在拍摄图像上显示的图像的冗余部分。比如预览尺寸为720*480,图片尺寸为3264*2448,那么如何确定预览中没有显示的多余部分,然后从拍摄的图像中剪掉呢?
    • @Behzad:如果您知道预览尺寸和最终图像尺寸,那么您应该能够通过一些基本数学计算出不可见区域(提示:您需要计算预览大小)。方程中唯一的变量是可见区域的“重力”。例如,使用“中心”重力,您需要从顶部和底部裁剪等量的不可见像素(而不是从侧面裁剪它们)。如果这听起来很复杂,只需在一张纸上画两个不同大小的矩形,然后做一个具体的例子。 :)
    • 谢谢,但是如何计算纵横比?这就是问题
    • @Behzad:纵横比无非就是宽除以高,反之亦然...
    • 你这样做了吗?如果你有解决方案,请分享一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多