2014-01-23 4 views
3

В моем приложении я загружаю изображение на сервер (используя следующий код). Я могу успешно загрузить изображение на сервер. Моя проблема в том, что если я загружу изображение, которое я взял на камеру, он занимает много времени для загрузки из-за размера изображения (1,5 - 5 МБ). Я видел много методов сжатия в android, но я не могу узнать, где я должен использовать это внутри своего кода, потому что я новичок в android.I хочу сократить время, затраченное на загрузку. Может ли кто-нибудь позвонить мне, как сжать изображение и загрузить на сервер?Загрузка сжатого изображения на сервер PHP

public int uploadFile(String sourceFileUri) { 


    String fileName = sourceFileUri; 

HttpURLConnection conn = null; 
DataOutputStream dos = null; 
String lineEnd = "\r\n"; 
String twoHyphens = "--"; 
String boundary = "*****"; 
int bytesRead, bytesAvailable, bufferSize; 
byte[] buffer; 
int maxBufferSize = 1 * 1024 * 1024; 
File sourceFile = new File(sourceFileUri); 

if (!sourceFile.isFile()) { 

    //dialog.dismiss(); 

    Log.e("uploadFile", "Source File not exist :"+imagepath); 

    runOnUiThread(new Runnable() { 
     public void run() { 
      messageText.setText("Source File not exist :"+ imagepath); 
     } 
    }); 

    return 0; 

} 
else 
{ 
    try { 


     // open a URL connection to the Servlet 
     FileInputStream fileInputStream = new FileInputStream(sourceFile); 
     URL url = new URL(upLoadServerUri); 

     // Open a HTTP connection to the URL 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); // Allow Inputs 
     conn.setDoOutput(true); // Allow Outputs 
     conn.setUseCaches(false); // Don't use a Cached Copy 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
     conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
     conn.setRequestProperty("uploaded_file", fileName); 

     dos = new DataOutputStream(conn.getOutputStream()); 

     dos.writeBytes(twoHyphens + boundary + lineEnd); 
     dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" 
           + fileName + "\"" + lineEnd); 

     dos.writeBytes(lineEnd); 

     // create a buffer of maximum size 
     bytesAvailable = fileInputStream.available(); 

     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 

     // read file and write it into form... 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

     while (bytesRead > 0) { 

      //dos.write(buffer, 0, bufferSize); 
      dos.write(buffer, 0, bytesRead); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

      } 

     // send multipart form data necesssary after file data... 
     dos.writeBytes(lineEnd); 
     dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // Responses from the server (code and message) 
     serverResponseCode = conn.getResponseCode(); 
     String serverResponseMessage = conn.getResponseMessage(); 

     Log.i("uploadFile", "HTTP Response is : " 
       + serverResponseMessage + ": " + serverResponseCode); 

     if(serverResponseCode == 200){ 

      runOnUiThread(new Runnable() { 
        public void run() { 
        //String msg = "File Upload Completed."; 
        //messageText.setText("File Upload Completed."); 
        // Toast.makeText(Messaging.this, "Image Sent Successfully", Toast.LENGTH_SHORT).show(); 

         dialog.dismiss(); 


         Toast toast = Toast.makeText(Messaging.this, "Image Successfully Shuffled and Sent \n You will be notified once it is solved", Toast.LENGTH_SHORT); 
         toast.setGravity(Gravity.CENTER|Gravity.CENTER, 0, 60); 
         toast.setDuration(Toast.LENGTH_LONG); 
         toast.show(); 
        } 
       });     
     }  

     //close the streams // 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 

    } catch (MalformedURLException ex) { 

     //dialog.dismiss(); 
     ex.printStackTrace(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
       messageText.setText("MalformedURLException Exception : check script url."); 
       Toast.makeText(Messaging.this, "MalformedURLException", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     Log.e("Upload file to server", "error: " + ex.getMessage(), ex); 
    } catch (Exception e) { 

     //dialog.dismiss(); 
     e.printStackTrace(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
       messageText.setText("Got Exception : see logcat "); 
       Toast.makeText(Messaging.this, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e); 
    } 

    return serverResponseCode; 

} 
} 

Заранее спасибо

+0

После выбора изображения с камеры вы можете поместить код сжатия, а затем передать его для загрузки. Покажите, какой код сжатия вы использовали? – GrIsHu

+0

Я использовал bitmap.compress (Bitmap.CompressFormat.JPEG, 70, fos); – user3226274

+0

Этого недостаточно для изменения размера изображения. – GrIsHu

ответ

0

Создание нового растрового изображения для старого образа, и вы должны изменить размер пикселя изображения, так что вы можете получить небольшой размер
Этот код может получить размер растрового изображения, так что вы можете преобразовать растровое изображение

public Bitmap getBitmapFromFile(File dst) { 
    if (null != dst && dst.exists()) { 
     BitmapFactory.Options opts = null; 
     opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(dst.getPath(), opts); 
     // calculate image size 
     int width; 
     int height; 
     if (opts.outHeight > opts.outWidth) { 
      height = 80; 
      width = 50; 
     } 
     else { 
      height = 60; 
      width = 80; 
     } 

     final int minSideLength = Math.min(width, height); 
     opts.inSampleSize = computeSampleSize(opts, minSideLength, 
       width * height); 
     opts.inJustDecodeBounds = false; 
     opts.inInputShareable = true; 
     opts.inPurgeable = true; 

     try { 
      return BitmapFactory.decodeFile(dst.getPath(), opts); 
     } catch (OutOfMemoryError e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

public static int computeSampleSize(BitmapFactory.Options options, 
     int minSideLength, int maxNumOfPixels) { 
    int initialSize = computeInitialSampleSize(options, minSideLength, 
      maxNumOfPixels); 

    int roundedSize; 
    if (initialSize <= 8) { 
     roundedSize = 1; 
     while (roundedSize < initialSize) { 
      roundedSize <<= 1; 
     } 
    } else { 
     roundedSize = (initialSize + 7)/8 * 8; 
    } 
    return roundedSize; 
} 

private static int computeInitialSampleSize(BitmapFactory.Options options, 
     int minSideLength, int maxNumOfPixels) { 
    double w = options.outWidth; 
    double h = options.outHeight; 

    int lowerBound = (maxNumOfPixels == -1) ? 1 : 
      (int) Math.ceil(Math.sqrt(w * h/maxNumOfPixels)); 
    int upperBound = (minSideLength == -1) ? 128 : 
      (int) Math.min(Math.floor(w/minSideLength), 
      Math.floor(h/minSideLength)); 

    if (upperBound < lowerBound) { 
     return lowerBound; 
    } 

    if ((maxNumOfPixels == -1) && 
      (minSideLength == -1)) { 
     return 1; 
    } else if (minSideLength == -1) { 
     return lowerBound; 
    } else { 
     return upperBound; 
    } 
} 

после конвертирования файла в растровом изображении, вы можете посмотреть этот tutorial конвертировать растровое в файл

+0

i ma получение этой ошибки @ henry4343 Метод computeSampleSize (BitmapFactory.Options, int, int) не определен – user3226274

+0

Я отредактировал свой ответ – henry4343

+0

thank u soo much @ henry4343. он отлично работает .... – user3226274

0

Попробуйте отредактировать размер, параметр samplingSize - это пиксель (ширина * высота) изображения, которое вы хотите.

public static Bitmap getSamplingImage(Bitmap sourceBitmap, int samplingSize) { 
    Bitmap outputBitmap = null; 
    int width = sourceBitmap.getWidth(); 
    int height = sourceBitmap.getHeight(); 
    int newWidth = width; 
    int newHeight = height; 

    if (newWidth * newHeight > samplingSize) { 
     while (true) { 
      if (newWidth * newHeight < samplingSize) 
       break; 
      newWidth /= 2; 
      newHeight /= 2; 
     } 
    } 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    Matrix matrix = new Matrix(); 
    matrix.postScale(scaleWidth, scaleHeight); 
    outputBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true); 
    return outputBitmap; 
} 
Смежные вопросы