2011-12-07 143 views
9

我正在上传图像到服务器,在此之前,我想调整图像尺寸。我得到一个URI这样的形象:调整图像文件的大小

Constants.currImageURI = data.getData(); 

这是调用上传的图片:

String response = uploadUserPhoto(new File(getRealPathFromURI(Constants.currImageURI))); 

    public String uploadUserPhoto(File image) { 

    DefaultHttpClient mHttpClient; 
    HttpParams params = new BasicHttpParams(); 
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    mHttpClient = new DefaultHttpClient(params); 

    try { 
     HttpPost httppost = new HttpPost("http://myurl/mobile/image"); 

     MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
     multipartEntity.addPart("userID", new StringBody(Constants.userID)); 
     multipartEntity.addPart("uniqueMobileID", new StringBody(Constants.uniqueMobileID)); 
     multipartEntity.addPart("userfile", new FileBody(image, "mobileimage.jpg", "image/jpeg", "UTF-8")); 
     httppost.setEntity(multipartEntity); 

     HttpResponse response = mHttpClient.execute(httppost); 
     String responseBody = EntityUtils.toString(response.getEntity()); 

     Log.d(TAG, "response: " + responseBody); 
     return responseBody; 

    } catch (Exception e) { 
     Log.d(TAG, e.getMessage()); 
    } 
    return ""; 
} 

是否有办法来调整基于像素大小的文件?

谢谢。

回答

8

这是从ThinkAndroid采取在这个网址: http://thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/

我会研究建立从资源位图或可绘制的可能性,如果你想改变它的大小使用下面的代码。

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    // Create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 

    // Resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 

    // Recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
    return resizedBitmap; 

} 

编辑:正如其他评论Bitmap.createScaledBitmap建议应调整时,可以使用更好的质量。

21

使用Bitmap.createScaledBitmap正如其他建议。

但是,这个功能不是很聪明。如果你扩展到低于50%的大小,你可能会得到这样的:

enter image description here

取而代之的是:

enter image description here

你看到第一个形象的坏抗锯齿? createScaledBitmap会让你得到这个结果。

原因是像素过滤,其中一些像素完全从源跳过,如果缩放到< 50%。

要获得第二个质量结果,如果它比所需结果大2倍以上,则需要将位图分辨率减半,最后再调用createScaledBitmap。

还有更多方法可以将图像减半(或缩小或变亮)。如果内存中有位图,则递归调用Bitmap.createScaledBitmap以将图像减半。

如果您从JPG文件加载图像,实现速度会更快:使用BitmapFactory.decodeFile并正确设置选项参数,主要是使用JPEG特性来控制加载图像的子图像的字段inSampleSize

许多提供图像缩略图的应用程序都是盲目地使用Bitmap.createScaledBitmap,而缩略图只是丑陋的。要聪明,并使用适当的图像下采样。

3

看看谷歌recommends doingas @Pointer Null advised):

public 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) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

我调用上面来调整一个大的图像:

// Check if source and destination exist 
// Check if we have read/write permissions 

int desired_width = 200; 
int desired_height = 200; 

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

BitmapFactory.decodeFile(SOME_PATH_TO_LARGE_IMAGE, options); 

options.inSampleSize = calculateInSampleSize(options, desired_width, desired_height); 
options.inJustDecodeBounds = false; 

Bitmap smaller_bm = BitmapFactory.decodeFile(src_path, options); 

FileOutputStream fOut; 
try { 
    File small_picture = new File(SOME_PATH_STRING); 
    fOut = new FileOutputStream(small_picture); 
    // 0 = small/low quality, 100 = large/high quality 
    smaller_bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut); 
    fOut.flush(); 
    fOut.close(); 
    smaller_bm.recycle(); 
} catch (Exception e) { 
    Log.e(LOG_TAG, "Failed to save/resize image due to: " + e.toString()); 
}