2015-12-18 3 views
0

Я пытался сохранить изображения в базе данных SQLite, но даже я сжимаю и масштабирую растровое изображение, файл все еще слишком велик, особенно когда вы снимаете изображение с камеры телефона.Возможно ли зашифровать bytearray/bitmap до определенного размера?

Есть ли какой-либо способ застегнуть bytearray/bitmap в определенный размер, например, от 4 мб до 500 кб? Если да, как я могу это сделать?

private void uriToFile(Uri uri, File sdImageMainDirectory) throws IOException { 

     Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
     OutputStream stream = new FileOutputStream(sdImageMainDirectory); 

     int bitmapWidth = bitmap.getWidth(); 
     int bitmapHeight = bitmap.getHeight(); 
     int maxSize = 10; 

     float bitmapRatio = (float) bitmapWidth/(float) bitmapHeight; 

     if(bitmapRatio > 0){ 
      bitmapWidth = maxSize; 
      bitmapHeight = (int) (bitmapWidth/bitmapRatio); 
     } 
     else{ 
      bitmapHeight = maxSize; 
      bitmapWidth = (int) (bitmapHeight * bitmapRatio); 
     } 
     bitmap.createScaledBitmap(bitmap, bitmapWidth, bitmapHeight, true); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 30, stream); 
     stream.flush(); 
     stream.close(); 
} 
+0

Итак, вы хотите, чтобы уменьшить размер 1/8? Кажется немного экстремальным, нет? Вы можете изменить размер изображения, но сжатие не является волшебным. – 323go

+0

Мне просто нужно, чтобы фотография могла храниться в одной строке из базы данных, так как каждая строка может только помещаться в 2 МБ, но я уже изменил размер и сжимаю растровое изображение, которое оно еще на 2 МБ. –

+0

Тогда сделайте его меньше. Еще раз, zip не волшебство. И большинство форматов изображений уже сжаты, что делает их очень слабыми кандидатами для дальнейшего сжатия. Как правило, плохая идея хранить большие двоичные данные в базе данных. Подумайте, как сохранить их в виде файлов в частной папке и сохранить ссылку в своей базе данных. – 323go

ответ

1

Вы на самом деле не сжимаете масштабированное изображение, а скорее оригинальное. Измените последние четыре строки в этом:

Bitmap scaled = bitmap.createScaledBitmap(bitmap, bitmapWidth, bitmapHeight, true); 
scaled.compress(Bitmap.CompressFormat.JPEG, 30, stream); 
stream.flush(); 
stream.close(); 

createScaledBitmap()возвращает уложенных растровые, и вы просто потеряли результат.

Вы должны быть в состоянии установить maxSize - 1000 и посмотреть размеры файлов ниже 500k.

+1

Вот и все, вы просто сохраняете мое приложение, спасибо. –

+0

Так рад, что вы его решили, и оказалось, что это так просто. – 323go

1

вы можете использовать эти коды также

String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
img_Decodable_Str = cursor.getString(columnIndex); 
cursor.close(); 

    **Bitmap bitmapImage = BitmapFactory.decodeFile(img_Decodable_Str); 
    Bitmap converetdImage = getResizedBitmap(bitmapImage, 500);** 
+0

Работала хорошо, спасибо –

Смежные вопросы