我正在将图像上传到服务器,在此之前,我想调整图像尺寸。我用这样的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 "";
}
有没有办法根据像素尺寸调整文件大小?
感谢。
答案 0 :(得分:22)
使用其他人建议的 Bitmap.createScaledBitmap 。
但是,这个功能不是很聪明。如果你缩小到不到50%的大小,你可能会得到这个:
而不是:
你看到第一张图片的抗锯齿效果不好吗? createScaledBitmap将为您提供此结果。
原因是像素过滤,如果缩放到<像素过滤,则会从源中完全跳过某些像素。 50%。
要获得第二个质量结果,如果它比预期结果大2倍,则需要将Bitmap的分辨率减半,然后最后调用createScaledBitmap。
还有更多方法可以将图像减半(或四分之一或变亮)。如果内存中有Bitmap,则递归调用Bitmap.createScaledBitmap将图像减半。
如果从JPG文件加载图像,实现速度更快:使用BitmapFactory.decodeFile并正确设置Options参数,主要是字段inSampleSize,它控制加载图像的子视频,利用JPEG的特性。
许多提供图像缩略图的应用程序盲目使用Bitmap.createScaledBitmap,缩略图只是丑陋。要聪明并使用正确的图像下采样。</ p>
答案 1 :(得分:9)
这是来自ThinkAndroid的网址: http://thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/
我会研究从资源创建Bitmap或Drawable的可能性,如果你想改变它的大小,请使用下面的代码。
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
应该在调整大小时用于提高质量。
答案 2 :(得分:5)
Bitmap.createScaledBitmap(src, dstWidth, dstHeight, filter)
答案 3 :(得分:5)
了解Google recommends doing(as @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());
}