2015-04-23 64 views
3

我正在制作一个android自定义相机应用程序。其中我想从前置摄像头拍摄一张照片并保存并显示给用户。但我在这里面临一些问题。有些设备工作得非常完美,但其他设备的效果并不理想,实际上它们是从顶部切割图像的。我已经提出了另一个问题here,但发现没有好的答案如何捕捉相机预览中显示的图像,并切出其长度和宽度

我与三件事情斗争,这是相机的最佳resoultion,屏幕大小(宽度和高度)和相机拍摄的位图的宽度和高度。我的应用程序在其他设备上运行良好,但由于其分辨率太高,无法在Lg上运行。

我将前置摄像头的最佳分辨率设置为1776 * 1080,而我将屏幕尺寸设置为1440 * 2392,但摄像头拍摄的图片的宽度和高度为1280 * 960。现在问题依然存在。我不知道如何获得如相机预览所示的相同图像,我不希望任何角落被切断。那么如何做到这一点。以下是我对获得optimalcamera 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; 
} 

,这里是我如何得到屏幕宽度和高度

DisplayMetrics displaymetrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     int screenHeight = displaymetrics.heightPixels; 
     int screenWidth = displaymetrics.widthPixels; 

以下是我设置参数的方法:

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

      camera.setParameters(parameters); 

**

那么,我怎样才能得到完整的照片,如相机预览所示。 ?请帮我

**

+1

如果您想获得与相机预览显示的图像相同的图像,则需要为您的相机设置'setPictureSize()'。首先,在'getSupportedPictureSizes()'上循环,然后找到最接近您的预览尺寸(具有相同宽高比)。 –

+0

你有解决这个问题吗?这里有同样的问题。 –

+0

@DuyPham你能解释一些代码吗? –

回答

0

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 

    } 
} 

ImgCap.class

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(); 

    } 

}

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> 
相关问题