2015-05-17 1 views
0

Я попытался отправить изображение на сервер из галереи, я сжал его с помощью Base64.
я начал деятельность по галерее:Отправить изображение на сервер из галереи android bitmap

private void startGalleryActivity() { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    String selectPicture = getResources().getString(R.string.select_picture); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    startActivityForResult(intent, GALLERY); 
} 

я получил результат в onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == GALLERY && resultCode == MainActivity.RESULT_OK) { 
     Uri pickedImage = data.getData(); 

     // Let's read picked image path using content resolver 
     String[] filePath = {MediaStore.Images.Media.DATA}; 
     Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null); 
     cursor.moveToFirst(); 
     String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0])); 

     // Now we need to set the GUI ImageView data with data read from the picked file. 
     imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath)); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 


     bitmap = BitmapFactory.decodeFile(imagePath, options); 

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

     bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); 
     byte[] byteArray = byteArrayOutputStream .toByteArray(); 

     String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT); 

     Server s = new Server("new"); 
     s.send(encoded); 

     // At the end remember to close the cursor or you will end with the RuntimeException! 
     cursor.close(); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 

Когда я отправить изображение, чтобы служить размер его в 4 раза выше. Если я напишу изображение после его чтения, это запись с двойным размером. Почему у меня эти накладные расходы?

ответ

0

Это будет примерно на 37% больше:

Очень грубо, окончательный размер в кодировке Base64 двоичных данных равен 1,37 раза исходного размера данных

Источник: http://en.wikipedia.org/wiki/Base64

2

Почему у меня это накладные расходы?

В дополнение к самим служебным данным Base64 вы перекодируете изображение как PNG. Если изображение начиналось как что-то еще, например JPEG, PNG-версия этого изображения может быть значительно больше.

Кроме того, пожалуйста, удалите четыре строки, которым предшествует // Let's read picked image path using content resolver. Во-первых, этот код не удастся на сотнях миллионов устройств Android, потому что a Uri is not a file, и вы не можете предположить, что вы можете получить путь к локальной файловой системе для этих данных. Во-вторых, вам это не нужно, поскольку BitmapFactory имеет метод decodeStream(), который вы можете использовать с getContentResolver().openInputStream(pickedImage).

Кроме того, просьба не звонить decode...() по телефону BitmapFactory. Загрузите растровое изображение один раз. Используйте растровое изображение как для ImageView, так и для загрузки.

1

Вызов компрессии на PNG не уменьшит ваш файл, поскольку он уже сжат. Преобразование двоичного файла в текстовый поток действительно сделает его большим. Чтобы избежать меньших накладных расходов путем преобразования PNG-файла в текстовый файл, просто отправьте файл как есть в виде массива байтов. И добавьте длину файла в заголовок. Вы можете использовать DataOutputStream для этого.

byte[] byteArray = byteArrayOutputStream .toByteArray(); 

ByteArrayOutputStream btOS = new ByteArrayOutputStream(); 
DataOutputStream dataOS = new DataOutputStreamEx(btOS); 

dataOS.writeInt(byteArray.length); // length of file 
dataOS.write(byteArray);   // actual file 
dataOS.write(0);     // end of field 
dataOS.close() 

Я не знаю, что вы используете в интерфейсе, но вы можете просто прочитать первые 4 байта, что вы получите, и это будет длина из вас файла. И используйте эту длину, чтобы прочитать весь файл.

0

Вы используете Bitmap и BitmapFactory для преобразования небольшого jpg-файла в большой файл png. Почему вы не отправляете jpg напрямую? Поэтому НЕ используйте Bitmap и BitmapFactory для начала. Вы закончите с чем-то, что не было вашим файлом.

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

  • Нет связанных вопросов^_^