2016-06-01 9 views
0

안녕하세요. 네이티브 카메라에서 캡처 한 후 이미지 크기를 조정하고 있습니다. 이미지 크기 조정은 정상적으로 작동하지만 크기가 조정 된 후에 이미지가 비뚤어지고 있습니다.크기 조정 후 이미지가 왜곡되고 있습니다.

여기는 이미지의 크기를 조정하는 데 사용하는 코드입니다. 여기

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