2014-09-02 67 views
2

我有一个方向问题。我的相机打开并将图像保存为90度。如何改变方向到potrait视图。请帮助我如何纠正它。在android中定制自定义摄像机方向问题

PictureDemo.java

package com.commonsware.android.picture; 

import java.io.File; 
import java.io.FileOutputStream; 
import android.app.Activity; 
import android.graphics.ImageFormat; 
import android.hardware.Camera; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.Toast; 

public class PictureDemo extends Activity { 
    private SurfaceView preview=null; 
    private SurfaceHolder previewHolder=null; 
    private Camera camera=null; 
    private boolean inPreview=false; 
    private boolean cameraConfigured=false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    preview=(SurfaceView)findViewById(R.id.preview); 
    previewHolder=preview.getHolder(); 
    previewHolder.addCallback(surfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void onResume() { 
    super.onResume(); 

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

    } 

    startPreview(); 
    } 

    @Override 
    public void onPause() { 
    if (inPreview) { 
     camera.stopPreview(); 
    } 

    camera.release(); 
    camera=null; 
    inPreview=false; 

    super.onPause(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.options, menu); 

    return(super.onCreateOptionsMenu(menu)); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.camera) { 
     if (inPreview) { 
     camera.takePicture(null, null, photoCallback); 
     inPreview=false; 
     } 
    } 

    return(super.onOptionsItemSelected(item)); 
    } 

    private Camera.Size getBestPreviewSize(int width, int height, 
             Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width <= width && size.height <= height) { 
     if (result == null) { 
      result=size; 
     } 
     else { 
      int resultArea=result.width * result.height; 
      int newArea=size.width * size.height; 

      if (newArea > resultArea) { 
      result=size; 
      } 
     } 
     } 
    } 

    return(result); 
    } 

    private Camera.Size getSmallestPictureSize(Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPictureSizes()) { 
     if (result == null) { 
     result=size; 
     } 
     else { 
     int resultArea=result.width * result.height; 
     int newArea=size.width * size.height; 

     if (newArea < resultArea) { 
      result=size; 
     } 
     } 
    } 

    return(result); 
    } 

    private void initPreview(int width, int height) { 
    if (camera != null && previewHolder.getSurface() != null) { 
     try { 
     camera.setPreviewDisplay(previewHolder); 
     } 
     catch (Throwable t) { 
     Log.e("PreviewDemo-surfaceCallback", 
       "Exception in setPreviewDisplay()", t); 
     Toast.makeText(PictureDemo.this, t.getMessage(), 
         Toast.LENGTH_LONG).show(); 
     } 

     if (!cameraConfigured) { 
     Camera.Parameters parameters=camera.getParameters(); 
     Camera.Size size=getBestPreviewSize(width, height, parameters); 
     Camera.Size pictureSize=getSmallestPictureSize(parameters); 

     if (size != null && pictureSize != null) { 
      parameters.setPreviewSize(size.width, size.height); 
      parameters.setPictureSize(pictureSize.width, 
            pictureSize.height); 
      parameters.set("orientation", "portrait"); 
      parameters.setPictureFormat(ImageFormat.JPEG); 

      camera.setParameters(parameters); 
      //camera.setDisplayOrientation(180); 

      cameraConfigured=true; 
     } 
     } 
    } 
    } 

    private void startPreview() { 
    if (cameraConfigured && camera != null) { 
    // camera.setDisplayOrientation(45); 
     camera.startPreview(); 

     inPreview=true; 
    } 
    } 

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() { 
    public void surfaceCreated(SurfaceHolder holder) { 
     // no-op -- wait until surfaceChanged() 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, 
           int width, int height) { 
     initPreview(width, height); 
     startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // no-op 
    } 
    }; 

    Camera.PictureCallback photoCallback=new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     new SavePhotoTask().execute(data); 
     camera.startPreview(); 
     inPreview=true; 
    } 
    }; 

    class SavePhotoTask extends AsyncTask<byte[], String, String> { 
    @Override 
    protected String doInBackground(byte[]... jpeg) { 
     File photo= 
      new File(Environment.getExternalStorageDirectory(), 
        "photo.jpg"); 

     if (photo.exists()) { 
     photo.delete(); 
     } 

     try { 
     FileOutputStream fos=new FileOutputStream(photo.getPath()); 

     fos.write(jpeg[0]); 
     fos.close(); 
     } 
     catch (java.io.IOException e) { 
     Log.e("PictureDemo", "Exception in photoCallback", e); 
     } 

     return(null); 
    } 
    } 
} 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.commonsware.android.picture" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="11" /> 

    <supports-screens 
     android:largeScreens="false" 
     android:normalScreens="true" 
     android:smallScreens="false" 
     android:xlargeScreens="true" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature 
     android:name="android.hardware.camera.front" 
     android:required="false" /> 

    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:icon="@drawable/cw" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".PictureDemo" 
      android:configChanges="keyboardHidden|orientation" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<android.view.SurfaceView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/preview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 

    > 
</android.view.SurfaceView> 
+0

你需要找到图片EXIF和需要旋转图像按的Exif,看一看这个项目:https://github.com/commonsguy/cwac-camera,另一个库:https://开头的github .com/krschultz/android-camera-test – 2014-09-02 07:25:14

+0

camera.setPreviewDisplay(previewHolder); camera.setDisplayOrientation(90); ; – 2014-09-02 07:28:38

回答

0

此代码将帮助您存储图像即时权利。

final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt); 
     final Matrix matrix = new Matrix(); 
     if (Utility.isTabletDevice(mContext)) { 
      // check Device is Tablet or Mobile 
     } 
     // opened camera is front or back 
     if (frontCamera == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      matrix.postRotate(270); 
     } else { 
      matrix.postRotate(90); 
     } 
     width = bitmap.getWidth(); 
     height = bitmap.getHeight(); 
     final Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
     final Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, true); 
     final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
     final File f = new File(imagePath); 
     f.createNewFile(); 
     final FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.flush(); 
     fo.close(); 
+0

我的预览只能从90开始。我不知道如何基于正常的方向旋转 – Giridharan 2014-09-02 07:24:09

+0

尝试删除该行的参数.set(“orientation”,“portrait”); – 2014-09-02 07:27:12

+0

并在你的项目AndroidManifest文件中设置此行为android:screenOrientation =“portrait” – 2014-09-02 07:29:24