Android高清拍照

来源:互联网 发布:黑马程序员javaee视频 编辑:程序博客网 时间:2024/04/26 08:58

     拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录。最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊。可能是图片被压缩的太狠了。所以自己使用Camera写了一个拍照的功能,拍出来的还挺清晰的,不过文件有点大一张图片差不多1.7M。如果想拍高清图可以使用下面的代码。

           代码很简单,我就不做过多解释了。

         

[html] view plain copy
  1. package com.example.testsimple;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.util.Date;  
  7.   
  8. import android.os.AsyncTask;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.app.Activity;  
  12. import android.content.Intent;  
  13. import android.graphics.Bitmap;  
  14. import android.graphics.BitmapFactory;  
  15. import android.graphics.PixelFormat;  
  16. import android.hardware.Camera;  
  17. import android.text.format.DateFormat;  
  18. import android.util.Log;  
  19. import android.view.KeyEvent;  
  20. import android.view.Menu;  
  21. import android.view.SurfaceHolder;  
  22. import android.view.SurfaceView;  
  23. import android.view.View;  
  24. import android.view.View.OnClickListener;  
  25. import android.widget.Button;  
  26. import android.widget.ImageView;  
  27.   
  28. public class MainActivity extends Activity {  
  29.   
  30.     private SurfaceView surfaceView;    
  31.     private SurfaceHolder surfaceHolder;    
  32.     private Camera camera;    
  33.     private File picture;    
  34.     private Button btnSave;    
  35.     private final static String TAG = "CameraActivity";    
  36.     private ImageView open_picIcon;  
  37.       
  38.     @Override  
  39.     public void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.activity_main);  
  42.           
  43.        /* Intent intent=new Intent(MainActivity.this,MyCameraActivity.class);  
  44.         startActivity(intent);  
  45.         finish();*/  
  46.         setupViews();  
  47.     }  
  48.   
  49.     private void setupViews(){    
  50.         surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components    
  51.         surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components    
  52.         surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder    
  53.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    
  54.             
  55.         btnSave = (Button) findViewById(R.id.save_pic);  
  56.         open_picIcon=(ImageView) findViewById(R.id.open_picIcon);  
  57.             
  58.         btnSave.setOnClickListener(new OnClickListener() {    
  59.                 
  60.             @Override    
  61.             public void onClick(View v) {  
  62.                 surfaceView.setVisibility(View.VISIBLE);  
  63.                 open_picIcon.setVisibility(View.GONE);  
  64.                 takePic();    
  65.             }    
  66.         });    
  67.     }    
  68.         
  69.     @Override    
  70.     public boolean onKeyDown(int keyCode, KeyEvent event) {    
  71.         if (keyCode == KeyEvent.KEYCODE_CAMERA    
  72.                 || keyCode == KeyEvent.KEYCODE_SEARCH) {    
  73.             takePic();    
  74.             return true;    
  75.         }    
  76.         return super.onKeyDown(keyCode, event);    
  77.     }    
  78.     
  79.     private void takePic() {    
  80.     
  81.         camera.stopPreview();// stop the preview    
  82.     
  83.         camera.takePicture(null, null, pictureCallback); // picture    
  84.     }    
  85.     
  86.     // Photo call back    
  87.     Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {    
  88.         //@Override    
  89.         public void onPictureTaken(byte[] data, Camera camera) {    
  90.             new SavePictureTask().execute(data);    
  91.             camera.startPreview();    
  92.         }    
  93.     };    
  94.     
  95.     // save pic    
  96.     class SavePictureTask extends AsyncTask<byte[], String, String> {    
  97.         @Override    
  98.         protected String doInBackground(byte[]... params) {    
  99.             String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";    
  100.                 
  101.             Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());    
  102.             //picture = new File(Environment.getExternalStorageDirectory(),fname);// create file    
  103.                 
  104.             picture = new File(Environment.getExternalStorageDirectory()+"/images/"+fname);    
  105.            File filepicture.getParentFile();  
  106.            if(!file.exists())  
  107.                      file.mkdir();  
  108.             try {    
  109.                 FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream    
  110.                 fos.write(params[0]); // Written to the file    
  111.                 fos.close();     
  112.             } catch (Exception e) {    
  113.                 e.printStackTrace();    
  114.             }    
  115.             return null;    
  116.         }    
  117.         @Override  
  118.         protected void onPostExecute(String result) {  
  119.             // TODO Auto-generated method stub  
  120.             super.onPostExecute(result);  
  121.               
  122.             Bitmap bitmap=getDiskBitmap(picture.getPath());  
  123.             surfaceView.setVisibility(View.GONE);  
  124.             open_picIcon.setVisibility(View.VISIBLE);  
  125.             open_picIcon.setImageBitmap(bitmap);  
  126.         }  
  127.           
  128.     }    
  129.     private Bitmap getDiskBitmap(String pathString)    
  130.     {    
  131.         Bitmap bitmap = null;    
  132.         try    
  133.         {    
  134.             File file = new File(pathString);    
  135.             if(file.exists())    
  136.             {    
  137.                 bitmap = BitmapFactory.decodeFile(pathString);    
  138.             }    
  139.         } catch (Exception e)    
  140.         {    
  141.             // TODO: handle exception    
  142.         }    
  143.             
  144.             
  145.         return bitmap;    
  146.     }    
  147.     // SurfaceHodler Callback handle to open the camera, off camera and photo size changes    
  148.     SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {    
  149.     
  150.         public void surfaceCreated(SurfaceHolder holder) {    
  151.             Log.i(TAG, "surfaceCallback====");    
  152.             camera = Camera.open(); // Turn on the camera    
  153.             try {    
  154.                 camera.setPreviewDisplay(holder); // Set Preview    
  155.             } catch (IOException e) {    
  156.                 camera.release();// release camera    
  157.                 camera = null;    
  158.             }    
  159.         }    
  160.     
  161.         public void surfaceChanged(SurfaceHolder holder, int format, int width,    
  162.                 int height) {    
  163.             Log.i(TAG,"====surfaceChanged");    
  164.             Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain    
  165.             parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format    
  166. //          parameters.set("rotation", 180); // Arbitrary rotation    
  167.             camera.setDisplayOrientation(0);    
  168.             parameters.setPreviewSize(400, 300); // Set Photo Size    
  169.             camera.setParameters(parameters); // Setting camera parameters    
  170.             camera.startPreview(); // Start Preview    
  171.         }    
  172.     
  173.         public void surfaceDestroyed(SurfaceHolder holder) {    
  174.             Log.i(TAG,"====surfaceDestroyed");    
  175.             camera.stopPreview();// stop preview    
  176.             camera.release(); // Release camera resources    
  177.             camera = null;    
  178.         }    
  179.     };    
  180. }  

     拍完以后自动保存到SD卡中的images目录下

     

       下面是图片存放路径

     

     1.8M 确实有点大,不过是高清图片 ,哈哈。

0 0
原创粉丝点击