2016-06-01 17 views
0

你好,我從本地相機捕捉後調整圖像大小..圖像調整大小工作正常,但我只有一個問題,這是調整後的圖像變得歪斜。圖像調整大小後出現傾斜android

這裏是我用來調整圖像大小的代碼。

File f = new File(Environment.getExternalStorageDirectory() + File.separator + "Bavel/" + imageName); 
FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(f); 
    if (orientation == ExifInterface.ORIENTATION_UNDEFINED) { 
     saveByteArray(fos, getBytesFromBitmap(loadedImage)); 
    } else { 
     saveByteArrayWithOrientation(fos, getBytesFromBitmap(loadedImage), orientation); 
    } 

} catch (FileNotFoundException e) { 
    Log.e("Error", "File not found: " + e.getMessage()); 
} catch (IOException e) { 
    Log.e("Error", "File write failure: " + e.getMessage()); 
} 


private void saveByteArray(FileOutputStream fos, byte[] data) throws IOException { 
     long time = System.currentTimeMillis(); 
     fos.write(data); 
     Log.e("saveByteArray: %1dms", "" + (System.currentTimeMillis() - time)); 
    } 

private void saveByteArrayWithOrientation(FileOutputStream fos, byte[] data, int orientation) { 

     long totalTime = System.currentTimeMillis(); 
     long time = System.currentTimeMillis(); 

     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     Log.e("decodeByteArray: %1dms", "" + (System.currentTimeMillis() - time)); 

     time = System.currentTimeMillis(); 
     if (orientation != 0 && bitmap.getWidth() > bitmap.getHeight()) { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(orientation); 

      int newWidth; 
      int newHeight; 

      if (bitmap.getWidth() > bitmap.getHeight()) { 
       newHeight = Helper.BITMAP_HEIGHT; 
       newWidth = Helper.BITMAP_HEIGHT * bitmap.getWidth()/bitmap.getHeight(); 
      } else { 
       newWidth = Helper.BITMAP_HEIGHT; 
       newHeight = Helper.BITMAP_HEIGHT * bitmap.getHeight()/bitmap.getWidth(); 
      } 

      bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, false); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
     } 
     time = System.currentTimeMillis(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, Helper.COMPRESS_QUALITY, fos); 
     Log.d("compress: %1dms", "" + (System.currentTimeMillis() - time)); 
     Log.d("bitmap height ", "" + bitmap.getHeight()); 
     Log.d("bitmap witdh ", "" + bitmap.getWidth()); 

     bitmap.recycle(); 

     Log.d("saveByte: %1dms", "" + (System.currentTimeMillis() - totalTime)); 
    } 

public byte[] getBytesFromBitmap(Bitmap bitmap) { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, Helper.COMPRESS_QUALITY, stream); 
     return stream.toByteArray(); 
    } 

這裏是輸出調整圖像

image after resizing

之後,但我想出來把這樣

enter image description here

請幫忙感謝提前幫助。

回答

0

我已經通過使用下面的代碼解決了這個問題。我添加了答案,以便對其他人有所幫助。

ExifInterface exif = new ExifInterface(imagePath); 
final int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
File root = new File(Environment.getExternalStorageDirectory(), "/Bavel/"); 
if (!root.exists()) { 
    root.mkdirs(); 
} 
File f = new File(Environment.getExternalStorageDirectory() 
     + File.separator + "Bavel/" + imageName); 
resizeNewImage(loadedImage, f, orientation); 



private void resizeNewImage(Bitmap bm, File file, int orientation) { 
    try { 
     if (bm.getWidth() > bm.getHeight()) { 
      int newWidth; 
      int newHeight; 

      if (bm.getWidth() > bm.getHeight()) { 
       newHeight = Helper.BITMAP_HEIGHT; 
       newWidth = Helper.BITMAP_HEIGHT * bm.getWidth()/bm.getHeight(); 
      } else { 
       newWidth = Helper.BITMAP_HEIGHT; 
       newHeight = Helper.BITMAP_HEIGHT * bm.getHeight()/bm.getWidth(); 
      } 

      Matrix matrix = new Matrix(); 
      switch (orientation) { 
       case ExifInterface.ORIENTATION_NORMAL: 
        matrix.postRotate(90); 
       case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: 
        matrix.setScale(-1, 1); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_180: 
        matrix.setRotate(180); 
        break; 
       case ExifInterface.ORIENTATION_FLIP_VERTICAL: 
        matrix.setRotate(180); 
        matrix.postScale(-1, 1); 
        break; 
       case ExifInterface.ORIENTATION_TRANSPOSE: 
        matrix.setRotate(90); 
        matrix.postScale(-1, 1); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_90: 
        matrix.setRotate(90); 
        break; 
       case ExifInterface.ORIENTATION_TRANSVERSE: 
        matrix.setRotate(-90); 
        matrix.postScale(-1, 1); 
        break; 
       case ExifInterface.ORIENTATION_ROTATE_270: 
        matrix.setRotate(-90); 
        break; 
       default: 
        matrix.postRotate(90); 
      } 
      bm = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true); 
      bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); 
//    file.createNewFile(); 
      FileOutputStream ostream = new FileOutputStream(file); 
      bm.compress(Bitmap.CompressFormat.JPEG, Helper.COMPRESS_QUALITY, ostream); 

      ostream.close(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}