将压缩后的图片上传到 PHP 服务器

3

在我的应用程序中,我使用以下代码将图像上传到服务器。我可以成功地将图像上传到服务器。我的问题是如果我上传一个通过相机拍摄的图像,由于图像的大小(1.5-5 MB),它需要很长时间才能上传。我在安卓上看到了许多压缩方法,但我不知道在我的代码中应该在哪里使用它,因为我是新手。我想减少上传所需的时间。有人能告诉我如何压缩图像并将其上传到服务器吗?

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; 

 } 
}

提前致谢


选择相机拍摄的图像后,您可以输入压缩代码,然后传输以进行上传。请展示您所使用的压缩代码。 - GrIsHu
我使用了bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); - user3226274
这并不足以调整您的图像大小。 - GrIsHu
2个回答

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 将位图转换为文件


我遇到了这个错误 @henry4343:方法computeSampleSize(BitmapFactory.Options,int,int)未定义。 - user3226274
还需要帮忙,上面的代码可以调整图像大小,但文件大小没有减小 @ henry4343 - user3226274
修改宽度和高度,然后再试一次? - henry4343

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接