Question

In my application i am uploading image to server(using following code) I can able to upload a image to server successfully. My problem is if i upload a image which i taken by camera it is taking long time to upload because of the size of image(1.5 - 5 MB). I saw many compression method in android but i cant find out where should i use that inside my code because i am new to android.I want to reduce the time taken to upload. Can any one tel me how to compress the image and upload to server?

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; 

 } 
}

Thanks in Advance

Was it helpful?

Solution

Create new image bitmap for old image, and you need to resize your image pixel so that you can get small size image
This code can get resize bitmap so that you can convert bitmap to image

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;
    }
}

after convert file to bitmap, you can look this tutorial convert bitmap to file

OTHER TIPS

Try this resize snippet, the parameter samplingSize is the pixel(width*height) of the image yout want.

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top