2016-11-19 9 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; 
    } 
Смежные вопросы