2013-07-04 17 views
3

我正在做一个应用程序,它使用相机拍摄照片,然后旋转并缩放它。 我需要旋转图像,因为相机返回错误的旋转图像,我需要缩放它以减小其大小。 我首先将临时目录保存在相机返回的原始图像中,然后我读取它并进行修改,将新图像保存到新文件中。 我尝试过使用矩阵来旋转和缩放图片,但它失去了质量。 然后我试着用Bitmap.createScaledBitmap先缩放它,然后用矩阵旋转它,但结果甚至比仅使用矩阵的结果更丑。 然后我试着先旋转它,然后使用总是Bitmap.createScaledBitmap来调整它的大小。图像不会丢失质量,但是在旋转图像后缩放它并将宽度和高度反转后,图像就会被拉伸。也尝试根据所做的旋转反转高度和宽度,但它又失去了质量。 这是我写的最后一段代码:Android - 缩放,旋转并将位图保存到SD卡而不会丢失质量

in= new FileInputStream(tempDir+"/"+photo1_path); 
      out = new FileOutputStream(file+"/picture.png"); 
      Bitmap src = BitmapFactory.decodeStream(in); 
      int iwidth = src.getWidth(); 
      int iheight = src.getHeight(); 
      int newWidth = 0; 
      int newHeight = 0; 

       newWidth = 800; 
       newHeight = 600; 

       // calculate the scale - in this case = 0.4f 
       float scaleWidth = ((float) newWidth)/iwidth; 
       float scaleHeight = ((float) newHeight)/iheight; 

       // createa matrix for the manipulation 
       Matrix matrix = new Matrix(); 
       // resize the bit map 
       //matrix.postScale(scaleWidth, scaleHeight); 
       int orientation = getOrientation(MyActivity.this,Uri.parse(tempDir+"/"+photo1_path)); 
       switch(orientation) { 
       case 3: 
        orientation = 180; 
        break; 
       case 6: 
        orientation = 90; 
        break; 
       case 8: 
        orientation = 270; 
        break; 
       } 
       int rotate = 0; 
       switch(orientation) { 
       case 90: 
        rotate=90; 
        break; 
       case 180: 
        rotate=180; 
        break; 
       case 270: 
        rotate=270; 
        break; 

       } 
       // rotate the Bitmap 
       matrix.postRotate(rotate); 

       src =Bitmap.createScaledBitmap(src , newWidth, newHeight, false); 
       // recreate the new Bitmap 
       Bitmap new_bit = Bitmap.createBitmap(src, 0, 0, 
           src.getWidth(), src.getHeight(), matrix, true); 
         new_bit.compress(Bitmap.CompressFormat.PNG, 100, out); 

有什么建议吗?

编辑:如果我只旋转或只缩放图像,它不会失去质量。这是当我做这两个图像失去质量。另外,如果我在调整大小和缩放大小后将图像放入ImageView中,它不会丢失质量,只是在将它保存到文件时丢失了质量。

回答

4

解决! 我使用BitmapFactory inSampleSize选项调整图像大小,图像不会丢失质量。 代码:

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
bmpFactoryOptions.inJustDecodeBounds = true; 
Bitmap bm = BitmapFactory.decodeFile(tempDir+"/"+photo1_path , bmpFactoryOptions); 


int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)600); 
int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)800); 

if (heightRatio > 1 || widthRatio > 1) 
{ 
    if (heightRatio > widthRatio){ 
     bmpFactoryOptions.inSampleSize = heightRatio; 
    } else { 
     bmpFactoryOptions.inSampleSize = widthRatio; 
    } 
} 

bmpFactoryOptions.inJustDecodeBounds = false; 
bm = BitmapFactory.decodeFile(tempDir+"/"+photo1_path, bmpFactoryOptions); 
//bm.compress(Bitmap.CompressFormat.PNG, 100, out); 
/*Bitmap new_bit = Bitmap.createScaledBitmap(src , newWidth, newHeight, true); 
      new_bit.compress(Bitmap.CompressFormat.PNG, 100, out);*/ 


// recreate the new Bitmap 
src = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(), bm.getHeight(), matrix, true); 


//Bitmap dest = Bitmap.createScaledBitmap(new_bit , newWidth, newHeight, true); 
src.compress(Bitmap.CompressFormat.PNG, 100, out); 
+0

问题与'Bitmap.CompressFormat.PNG'就是文件每次旋转时都会变大。 –

0

使用这种方法将旋转位图...

private Bitmap checkifImageRotated() { 
    ExifInterface exif; 
    try { 
     exif = new ExifInterface(file.getAbsolutePath()); 
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
     int rotate = 0; 
     switch (orientation) { 
      case ExifInterface.ORIENTATION_ROTATE_270 : 
       rotate = -90; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_180 : 
       rotate = 180; 
       break; 
      case ExifInterface.ORIENTATION_ROTATE_90 : 
       rotate = 90; 
       break; 
     } 
     if (rotate != 0) { 
      Bitmap bitmap = BitmapFactory.decodeFile(getTempFile().getPath()); 
      Matrix matrix = new Matrix(); 
      matrix.setRotate(rotate); 
      Bitmap bmpRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); 
      recycle(bitmap); 
      return bmpRotated; 
     } 
    } 
    catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

谢谢,我刚刚尝试过,但没有变化,它总是失去质量。无论如何,你也使用矩阵来旋转图像,所以看起来似乎没有什么变化,即使用ExifInterface得到方向:( – dany84

0

不要让新的位图只覆盖

INT角度= 0; int valueangle = 0;位图位图;

 @Override 
     public void onClick(View v) { 

      System.out.println("valueeeeeee " + angle); 
      if (bitmap != null) { 

       angle = valueangle + 90; 



       Matrix matrix = new Matrix(); 
       matrix.postRotate(angle); 

       bitmap = Bitmap.createBitmap(
         bitmap , 0, 0, 
         bitmap .getWidth(), 
         bitmap .getHeight(), matrix, true); 



       main_img.setImageBitmap(bitmap); 

      } else { 

       System.out.println(" bitmap is null"); 
      } 

     } 
+0

谢谢,我刚刚试图重写,但结果是一样的,图像质量下降,如果这个代码是帮助完全接受和upvote – dany84

+0

意味着改变什么解释得当, –

+0

这个代码没有解决我的问题,我不能接受它,对不起,我可以改变一些东西吗? – dany84

相关问题