2012-05-31 144 views
3

我正在運行一個應用程序,該應用程序將始終以手機上的肖像運行。拍攝照片時,我可以在手機上看到肖像圖像,但是,當它保存到SD卡時,圖像始終處於橫向。這是我做了什麼,我用這個清單以肖像保存照片

<uses-feature android:name="android.hardware.screen.portrait" /> 

當我啓動相機,我用保存照片時,下面來改變方向

camera = Camera.open(); // <8> 
    Camera.Parameters parameters = camera.getParameters(); 
    camera.setDisplayOrientation(90); 
    parameters.setZoom(16); 
    parameters.setPictureFormat(PixelFormat.JPEG); 
    camera.setParameters(parameters); 

然後,我用這個代碼

PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outStream = null; 
      boolean mExternalStorageAvailable = false; 
      boolean mExternalStorageWriteable = false; 
      String state = Environment.getExternalStorageState(); 
      if (Environment.MEDIA_MOUNTED.equals(state)) { 
       // We can read and write the media 
       mExternalStorageAvailable = mExternalStorageWriteable = true; 
       Log.d(TAG, "Can Write "); 
       try { 
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
        String fileName = "/" + System.currentTimeMillis() + ".jpg"; 
        Log.d(TAG, "File: " + baseDir + fileName); 
        outStream = new FileOutputStream(baseDir + fileName); 
        outStream.write(data); 
        outStream.close(); 

        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 

      } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
       // We can only read the media 
       mExternalStorageAvailable = true; 
       mExternalStorageWriteable = false; 
       Log.d(TAG, "Cant Write "); 
      } else { 
       // Something else is wrong. It may be one of many other states, but all we need 
       // to know is we can neither read nor write 
       mExternalStorageAvailable = mExternalStorageWriteable = false; 
       Log.d(TAG, "Other Error "); 
      } 
       } 
    }; 

回答

2

我已通過使用以下代碼

PictureCallback jpegCallback = new PictureCallback() { 
    @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 1; 
     options.inDither = false; // Disable Dithering mode 
     options.inPurgeable = true; // Tell to gc that whether it needs free 
            // memory, the Bitmap can be cleared 
     options.inInputShareable = true; // Which kind of reference will be 
              // used to recover the Bitmap 
              // data after being clear, when 
              // it will be used in the future 
     options.inTempStorage = new byte[32 * 1024]; 
     options.inPreferredConfig = Bitmap.Config.RGB_565; 
     Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, data.length, options); 

     int orientation; 
     // others devices 
     if(bMap.getHeight() < bMap.getWidth()){ 
      orientation = 90; 
     } else { 
      orientation = 0; 
     } 

     Bitmap bMapRotate; 
     if (orientation != 0) { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(orientation); 
      bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), 
        bMap.getHeight(), matrix, true); 
     } else 
      bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(), 
        bMap.getHeight(), true); 


     FileOutputStream out; 
    boolean mExternalStorageAvailable = false; 
    boolean mExternalStorageWriteable = false; 
     try { 
     String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String fileName = "/" + System.currentTimeMillis() + ".jpg"; 

      out = new FileOutputStream(baseDir + fileName); 
      bMapRotate.compress(Bitmap.CompressFormat.JPEG, 50, out); 
      if (bMapRotate != null) { 
       bMapRotate.recycle(); 
       bMapRotate = null; 
      } 


     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
}; 
完成上述