2013-09-10 2 views
3

Привет, я хотел загрузить изображения с высоким разрешением на свой php-сервер. Теперь я отправляю изображения на свой сервер с использованием закодированной строки. Проблема здесь: я не могу загрузить изображение с высоким разрешением, это приводит меня к Out памяти. Мое изображение размером около 1-2 МБ. Вот фрагмент, как я загружаю изображение на сервер.Загрузка изображений с высоким разрешением в android

String encodedPagerpath=""; 
       if(!FILE_PAGER_PATH.equals("") && FILE_PAGER_PATH.length()!=0) 
       { 
        byte [] b=imageTobyteArray(FILE_PAGER_PATH,150,150); 
        if(b!=null) 
        { 
         encodedPagerpath=Base64.encodeToString(b, Base64.DEFAULT); 
         if(encodedPagerpath==null || encodedPagerpath.equals("")){ 
          encodedPagerpath=""; 
         } 
        } 
       } 

//Convert image into byte array 
    static byte[] imageTobyteArray(String path,int width,int height) 
    { byte[] b = null ; 
    if(!path.equals("") || path.length()!=0) 
    { 


     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     options.inDither=true;//optional 
     options.inPreferredConfig=Bitmap.Config.RGB_565;//optional 

     Bitmap bm = BitmapFactory.decodeFile(path,options); 

     options.inSampleSize = calculateInSampleSize(options, width, height); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 

     bm=BitmapFactory.decodeFile(path,options); 


     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bm.compress(Bitmap.CompressFormat.JPEG, 70, baos); //bm is the bitmap object 
     b= baos.toByteArray(); 
    } 
    return b; 
    } 

public static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 

      // Calculate ratios of height and width to requested height and width 
      final int heightRatio = Math.round((float) height/(float) reqHeight); 
      final int widthRatio = Math.round((float) width/(float) reqWidth); 

      // Choose the smallest ratio as inSampleSize value, this will guarantee 
      // a final image with both dimensions larger than or equal to the 
      // requested height and width. 
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
     } 

     return inSampleSize; 
    } 

Я отправляю эту закодированную строку в объект json. Есть ли лучший подход, на который я могу пойти? Если я выйду за пределы 150X150, это приведет меня к OOM. Я хочу загрузить файл с высоким разрешением без потери его качества.

+0

Не загружайте большие изображения в качестве base64, а отправляйте массив байтов: откройте выходной поток на свой сервер, откройте входной поток в растровое изображение, а затем прочитайте куски данных из входного потока, напишите их в выходной поток , Таким образом, размер растрового изображения не имеет значения. Я отправил этот образ на 60 МБ. – gunar

+0

@gunar вы можете вставить пример кода для этого? и нужно ли загружать изображение отдельно? вместо того, чтобы помещать его в объект json? – Manoj

+1

В Интернете полно этого: google для '' and bit post bitmap byte array''. Не отправляйте json, так как вы будете вынуждены использовать base64 таким образом. Создайте API на стороне сервера, который знает, как обращаться с типами изображений «image/*». – gunar

ответ

1

Я использовал MultipartEntity из библиотеки Apache Commons (httpmime.jar) в запросе моей POST для загрузки файла изображения:

public static HttpEntity createMultipartBody(File file) throws IOException{ 
    MultipartEntity entity = new MultipartEntity(); 
    entity.addPart(key, new FileBody(file)); 
    return entity; 
} 

Затем создать простой HttpPost, набор Entity к нему и отправить его на сервер:

+0

Можете ли вы уточнить это больше, я новый пчела к этому.! – Manoj

+0

Что именно вы хотите уточнить? – Viacheslav

+0

Я просил учебника. – Manoj

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