2016-11-19 97 views
1

我有一个应用程序,用户可以在其中创建事件并从图库中上传图像并将其上传到FirebaseStorage。一切工作正常,但图像真的很大,我想优化加载/下载过程。我已经尝试过这一点:上传到FirebaseStorage之前的图像压缩

// Get the data from an ImageView as bytes 
imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(); 
Bitmap bitmap = imageView.getDrawingCache(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] data = baos.toByteArray(); 

UploadTask uploadTask = mountainsRef.putBytes(data); 
uploadTask.addOnFailureListener(new OnFailureListener() { 
@Override 
public void onFailure(@NonNull Exception exception) { 
    // Handle unsuccessful uploads 
} 
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
@Override 
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
    // taskSnapshot.getMetadata() contains file metadata such as size, content-type 
    Uri downloadUrl = taskSnapshot.getDownloadUrl(); 
} 
}); 

和设置bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos); 这工作,但这个基本上使得每一个形象丑陋。 如果可能的话,是否有方法可以减少图像的大小而不会完全破坏质量?

回答

1

什么帮助我为我缩小图像分辨率拍摄的图像转换 1280×720后,然后通过更多的 下降了50%我的文件大小。

下面是一个示例方法。

/** 
    * Compress the file and return the compressed photo 
    * 
    * @return photoFile 
    */ 
    public File PhotoCompressor(File PhotoFile) { 
     Bitmap b = BitmapFactory.decodeFile(photoFile.getAbsolutePath()); 


     int originalWidth = b.getWidth(); 
     int originalHeight = b.getHeight(); 
     int boundWidth = COMPRESSED_PHOTO_WIDTH; 
     int boundHeight = COMPRESSED_PHOTO_HEIGHT; 
     int newWidth = originalWidth; 
     int newHeight = originalHeight; 

     //check if the image needs to be scale width 
     if (originalWidth > boundWidth) { 
      //scale width to fit 
      newWidth = boundWidth; 
      //scale height to maintain aspect ratio 
      newHeight = (newWidth * originalHeight)/originalWidth; 
     } 

     //now check if we need to scale even the new height 
     if (newHeight > boundHeight) { 
      //scale height to fit instead 
      newHeight = boundHeight; 
      //scale width to maintain aspect ratio 
      newWidth = (newHeight * originalWidth)/originalHeight; 
     } 
     Log.i(TAG, "Original Image:" + originalHeight + " x" + originalWidth); 
     Log.i(TAG, "New Image:" + newHeight + " x" + newWidth); 
     try { 
      Bitmap out = Bitmap.createScaledBitmap(b, newWidth, newHeight, true); 
      FileOutputStream fOut; 
      fOut = new FileOutputStream(photoFile); 
      out.compress(Bitmap.CompressFormat.JPEG, 100, fOut); 
      fOut.flush(); 
      fOut.close(); 
      b.recycle(); 
      out.recycle(); 
     } catch (OutOfMemoryError exception) { 
      Log.e(TAG, "OutofMemory excpetion" + exception); 
      exception.printStackTrace(); 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "File not found excpetion" + e); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e(TAG, "IO exception excpetion" + e); 
      e.printStackTrace(); 
     } 
     return photoFile; 
    }