2014-06-05 52 views
0

我上传的图像到服务器,但问题是当我缩放图像,并将其上传到服务器它工作正常,但图像太小...我怎么能得到原服务器端的大小图像...没有缩放我越来越内存异常....有没有什么办法使用我可以上传我的图像到服务器或我可以将缩放图像转换回上一个。我已经在manifest中使用了大堆。请帮助我...上传原始大小的图像到服务器

imageUpload=BitmapFactory.decodeFile(file_path); 
      stream = new ByteArrayOutputStream(); 
      imageUpload1 = Bitmap.createScaledBitmap(imageUpload, 100, 50, true); 
      imageUpload1.compress(Bitmap.CompressFormat.JPEG, 60, stream); //compress to which format you want. 
      /*ImageView imageView = (ImageView) findViewById(R.id.imageView); 
      imageView.setImageResource(imageupload1);*/ 

      byte_arr = stream.toByteArray(); 
//   image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT); 




      // albumThumbnail = Base64.encodeToString(byte_arr, Base64.DEFAULT); 
      albumThumbnail = Base64.encodeBytes(byte_arr); 

      //add this line 
      imageUpload1.recycle(); 
      imageUpload1= null; 

      } 
    } 

    private void uplaodImageServer() 
    { 
     getDateAndTime(); 
     albumName=albumTitle.getText().toString(); 

     Log.e("albumname",albumName); 
     Log.e("filePath",file_path); 

     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair("albumtitle",albumName)); 
     params.add(new BasicNameValuePair("albumthumbnail", albumThumbnail)); 
     params.add(new BasicNameValuePair("dateCreated",dateCreated)); 
     params.add(new BasicNameValuePair("filePath",file_path)); 
     params.add(new BasicNameValuePair("imagename",uploadImageName)); 
     // FileBody bin = new FileBody(file); 


      try 
      { 
       HttpClient httpclient = new DefaultHttpClient(); 
       httppost=new HttpPost("http://ur ip address/freeJeetoAndroid/CreateAlbum.php"); 
       httppost.setEntity(new UrlEncodedFormEntity(params)); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 
     }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 
+2

你为什么不把它作为一个文件发送?使用FileOutputStream? – PKlumpp

+0

@ZERO:它能解决我的问题吗? –

+1

好吧,你用一个简单的outputStream发送图像。没有缩放或什么,你只是发送数据,就是这样。互联网上有成千上万的指导。并且您的服务器将以原始格式获取文件,您还可以通过这种方式传输音频或视频文件。这是非常简单的 – PKlumpp

回答

1

嗨我找到了解决方案,我的上述问题。希望它能帮助别人......

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (requestCode == PICK_IMAGE && resultCode == RESULT_OK) { 

      Uri selectedImage = data.getData(); 
      String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = getContentResolver().query(selectedImage, 
      filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      columnindex = cursor.getColumnIndex(filePathColumn[0]); 
      file_path = cursor.getString(columnindex); 
      // Log.e("Attachment Path:", attachmentFile); 
      // tv_attach.setText(file_path); 
      Log.e("file_path",file_path); 
      URI = Uri.parse("file://" + file_path); 

      //Retrieve filename and extension 

      Filename imageFileName = new Filename(file_path, '/', '.'); 
      extension=imageFileName.extension(); 
      fileName=imageFileName.filename(); 
      System.out.println("Extension = " + imageFileName.extension()); 
      System.out.println("Filename = " + imageFileName.filename()); 
      //System.out.println("Path = " + imageFileName.path()); 
      cursor.close(); 

      uploadImageName=fileName+"."+extension; 
      imagename.setText(uploadImageName); 


      BitmapFactory.Options options = new BitmapFactory.Options(); 

//  by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If 
//  you try the use the bitmap here, you will get null. 
      options.inJustDecodeBounds = true; 
      Bitmap bmp = BitmapFactory.decodeFile(file_path, options); 

      int actualHeight = options.outHeight; 
      int actualWidth = options.outWidth; 

//  max Height and width values of the compressed image is taken as 816x612 

      float maxHeight = 816.0f; 
      float maxWidth = 612.0f; 
      float imgRatio = actualWidth/actualHeight; 
      float maxRatio = maxWidth/maxHeight; 

//  width and height values are set maintaining the aspect ratio of the image 

      if (actualHeight > maxHeight || actualWidth > maxWidth) { 
       if (imgRatio < maxRatio) {    imgRatio = maxHeight/actualHeight;    actualWidth = (int) (imgRatio * actualWidth);    actualHeight = (int) maxHeight;    } else if (imgRatio > maxRatio) { 
        imgRatio = maxWidth/actualWidth; 
        actualHeight = (int) (imgRatio * actualHeight); 
        actualWidth = (int) maxWidth; 
       } else { 
        actualHeight = (int) maxHeight; 
        actualWidth = (int) maxWidth; 

       } 
      } 

//  setting inSampleSize value allows to load a scaled down version of the original image 

      options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 

//  inJustDecodeBounds set to false to load the actual bitmap 
      options.inJustDecodeBounds = false; 

//  this options allow android to claim the bitmap memory if it runs low on memory 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      options.inTempStorage = new byte[16 * 1024]; 

      try { 
//   load the bitmap from its path 
       bmp = BitmapFactory.decodeFile(file_path, options); 
      } catch (OutOfMemoryError exception) { 
       exception.printStackTrace(); 

      } 
      try { 
       scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888); 
      } catch (OutOfMemoryError exception) { 
       exception.printStackTrace(); 
      } 

      float ratioX = actualWidth/(float) options.outWidth; 
      float ratioY = actualHeight/(float) options.outHeight; 
      float middleX = actualWidth/2.0f; 
      float middleY = actualHeight/2.0f; 

      Matrix scaleMatrix = new Matrix(); 
      scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 

      Canvas canvas = new Canvas(scaledBitmap); 
      canvas.setMatrix(scaleMatrix); 
      canvas.drawBitmap(bmp, middleX - bmp.getWidth()/2, middleY - bmp.getHeight()/2, new Paint(Paint.FILTER_BITMAP_FLAG)); 

//  check the rotation of the image and display it properly 
      ExifInterface exif; 
      try { 
       exif = new ExifInterface(file_path); 

       int orientation = exif.getAttributeInt(
         ExifInterface.TAG_ORIENTATION, 0); 
       Log.d("EXIF", "Exif: " + orientation); 
       Matrix matrix = new Matrix(); 
       if (orientation == 6) { 
        matrix.postRotate(90); 
        Log.d("EXIF", "Exif: " + orientation); 
       } else if (orientation == 3) { 
        matrix.postRotate(180); 
        Log.d("EXIF", "Exif: " + orientation); 
       } else if (orientation == 8) { 
        matrix.postRotate(270); 
        Log.d("EXIF", "Exif: " + orientation); 
       } 
       scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, 
         scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, 
         true); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      stream = new ByteArrayOutputStream(); 
//   write the compressed bitmap at the destination specified by filename. 
       scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, stream); 




//   imageUpload=BitmapFactory.decodeFile(file_path); 

      //imageUpload1 = Bitmap.createScaledBitmap(imageUpload, 256, 256, true); 
//   imageUpload.compress(Bitmap.CompressFormat.PNG, 50, stream); //compress to which format you want. 
      /*ImageView imageView = (ImageView) findViewById(R.id.imageView); 
      imageView.setImageResource(imageupload1);*/ 

      byte_arr = stream.toByteArray(); 
//   image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT); 




      // albumThumbnail = Base64.encodeToString(byte_arr, Base64.DEFAULT); 
      albumThumbnail = Base64.encodeBytes(byte_arr); 

      //add this line 
//   imageUpload.recycle(); 
//   imageUpload= null; 

      } 
    } 

      public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
       final int height = options.outHeight; 
       final int width = options.outWidth; 
       int inSampleSize = 1; 

       if (height > reqHeight || width > reqWidth) { 
        final int heightRatio = Math.round((float) height/ (float) reqHeight); 
        final int widthRatio = Math.round((float) width/(float) reqWidth); 
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;  }  final float totalPixels = width * height;  final float totalReqPixelsCap = reqWidth * reqHeight * 2;  while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
        inSampleSize++; 
       } 

       return inSampleSize; 
      } 
+1

这看起来不像你的问题的答案 - 它是二次采样图像,所以你aren不保留原始尺寸,并且不显示正在上传的图像。 –

+0

@DaveMorrissey:我想让我的图片上传到服务器上,并以它的方式进行查看...... n上传的代码是相同的 –