Android 如何在不剪切图像长度和宽度的情况下捕获图像,如“摄影机预览”中所示

Android 如何在不剪切图像长度和宽度的情况下捕获图像,如“摄影机预览”中所示,android,camera,android-camera,Android,Camera,Android Camera,我正在制作一个android定制相机应用程序。在它里面,我想从前面的摄像头中拍摄一张照片,保存下来并展示给用户。但我在这里面临一些问题。一些设备工作得非常完美,但另一些设备工作得不好,事实上,它们从顶部开始切割图像的长度。我又问了一个问题,但没有找到好答案 我正在努力解决三个问题,即相机的最佳资源配置、屏幕大小(宽度和高度)以及相机拍摄的位图的宽度和高度。我的应用程序在其他设备上运行良好,但在Lg set上运行不好,因为它的分辨率太高 我得到的前摄像头的最佳分辨率为1776*1080,其中屏幕尺

我正在制作一个android定制相机应用程序。在它里面,我想从前面的摄像头中拍摄一张照片,保存下来并展示给用户。但我在这里面临一些问题。一些设备工作得非常完美,但另一些设备工作得不好,事实上,它们从顶部开始切割图像的长度。我又问了一个问题,但没有找到好答案

我正在努力解决三个问题,即相机的最佳资源配置、屏幕大小(宽度和高度)以及相机拍摄的位图的宽度和高度。我的应用程序在其他设备上运行良好,但在Lg set上运行不好,因为它的分辨率太高

我得到的前摄像头的最佳分辨率为1776*1080,其中屏幕尺寸为1440*2392,但摄像头拍摄的照片的宽度和高度为1280*960。现在问题仍然存在。我不知道如何获得与相机预览相同的图像,我不希望它的任何一个角被切掉。那么如何做到这一点。以下是我的代码,用于获得最佳的相机suize

  public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio=(double)h / w;

    if (sizes == null) return null;

    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    for (Camera.Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Camera.Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}
下面是我设置参数的方式:

    Camera.Size previewSize = getOptimalPreviewSize(previewSizes,screenWidth,screenHeight);
 parameters.setPreviewSize(previewSize.width,previewSize.height);
parameters.setZoom(Camera.Parameters.FOCUS_DISTANCE_OPTIMAL_INDEX);

            camera.setParameters(parameters);
**

那么,我怎样才能得到相机预览所显示的完整画面呢?请帮帮我

**CameraView.class

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;

public class CameraView extends Activity implements SurfaceHolder.Callback,OnClickListener {
    OutputStream output;
    File dir;
    private static final String TAG="CameraTest";
    Camera camera;
    boolean mPreviewRunning=false;
    public void onCreate(Bundle icicle){

        super.onCreate(icicle);
        Log.e(TAG,"onCreate");
        File filepath=Environment.getExternalStorageDirectory();
        dir=new File(filepath.getAbsolutePath()+"/Cam/");
        dir.mkdirs();
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.cameraview);
        mSurfaceView=(SurfaceView)findViewById(R.id.surface_camera);
        //mSurfaceView.setOnClickListener(this);

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                camera.takePicture(null,mPictureCallback,mPictureCallback);
            }
        },6000);

        mSurfaceHolder=mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
}
    Camera.PictureCallback mPictureCallback=new Camera.PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            if(data!=null)
            {
                camera.stopPreview();
                mPreviewRunning=false;
                camera.release();
                try
                {
                    BitmapFactory.Options opts=new BitmapFactory.Options();
                    Bitmap bitmap=BitmapFactory.decodeByteArray(data,0,data.length,opts);
                    bitmap=Bitmap.createScaledBitmap(bitmap,480,480,false);
                    File file=new File(dir,"raj.jpg");
                    try
                    {
                        output=new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, output);
                        output.flush();
                        output.close();
                        String url=Images.Media.insertImage(getContentResolver(),bitmap, "raj.jpg",null);
                    }
                    catch(Exception e)
                    {

                    }

                    ImgCap.image.setImageBitmap(bitmap);
                }
                catch (Exception e) {
                    // TODO: handle exception
                e.printStackTrace();
                }
                setResult(585);
                finish();           }

        }
    };




protected void onResume()
{
    Log.e(TAG,"onResume");
    super.onResume();
}
protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);
}
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.e(TAG,"surfaceChanged");
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD)
        {
        Camera.CameraInfo info=new Camera.CameraInfo();
        for(int i=0;i<Camera.getNumberOfCameras();i++)
        {
            Camera.getCameraInfo(i,info);
            if(info.facing==Camera.CameraInfo.CAMERA_FACING_FRONT)
            {
                camera=Camera.open(i);
            }
        }
        }
        if(camera==null)
        {
        camera=Camera.open();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if(mPreviewRunning)
        {
            camera.stopPreview();
        }
        Camera.Parameters p=camera.getParameters();
        p.setPreviewSize(width, height);
        camera.setParameters(p);
        try
        {
            camera.setPreviewDisplay(holder);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        camera.startPreview();
        mPreviewRunning=true;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.e(TAG,"surfaceDestroyed");
    }

    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}
}

cameraview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
<SurfaceView  android:id="@+id/surface_camera"
    android:layout_width="fill_parent"
    android:layout_height="10dip"
    android:layout_weight="1"
    />    

</LinearLayout>


如果要获得与相机预览相同的图像,需要为相机设置
setPictureSize()
。首先,循环使用
getSupportedPictureSizes()
,然后找到与预览大小最接近的大小(具有相同的纵横比)。您有解决方案吗?这里也有同样的问题。@DuyPham你能用一些代码解释一下吗?
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class ImgCap extends Activity {
    public static ImageView image;
    private Button btn_camera;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        image = (ImageView) findViewById(R.id.image);
        btn_camera = (Button) findViewById(R.id.btn_camera);
        btn_camera.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent i = new Intent(ImgCap.this, CameraView.class);
                startActivityForResult(i, 999);

            }
});
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        if (requestCode == 999) {
            if (resultCode == 585) {

            } else {
                alert("Picture not Captured");
            }
        }
    }

    private void alert(String string) {
        // TODO Auto-generated method stub
        AlertDialog.Builder alert = new AlertDialog.Builder(ImgCap.this);
        alert.setMessage(string);
        alert.setTitle("Alert");
        alert.setNeutralButton("OK", null);
        alert.show();

    }
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
<SurfaceView  android:id="@+id/surface_camera"
    android:layout_width="fill_parent"
    android:layout_height="10dip"
    android:layout_weight="1"
    />    

</LinearLayout>