当我作为base64发送到服务器时,我想重用位图的大小。例如,原始图像大小为1.2 MB,因此我必须将其大小调整为50KB(服务器限制端)。 The way有时会使图像失真。我看过[1]和[2],但没有帮助。
问题是调整大小后某些图像会变形。
这是我的代码:
private String RescaleImage(String bitmap, int size) {
try {
if ((float) bitmap.getBytes().length / 1000 <= Constants.PROFILE_IMAGE_LIMITED_SIZE) {
return bitmap;
} else {
//Rescale
Log.d("msg", "rescale size : " + size);
size -= 1;
bitmap = BitmapBase64Util.encodeToBase64(Bitmap.createScaledBitmap(decodeBase64(bitmap), size, size, false));
return RescaleImage(bitmap, size);
}
} catch (Exception e) {
return bitmap;
}
}
encodingToBase64:
public static String encodeToBase64(Bitmap image) {
Log.d(TAG, "encoding image");
String result = "";
if (image != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
result = Base64.encodeToString(b, Base64.DEFAULT);
Log.d(TAG, result);
return result;
}
return result;
}
在调整大小之前裁剪图像。裁剪后的尺寸为300 x 300
我的问题是:
如何将图片尺寸重复使用到50KB,保持相同比例并避免扭曲?
答案 0 :(得分:0)
您在Bitmap.createScaledBitmap(decodeBase64(bitmap), size, size, false)
中传递相同的宽度和高度。除非您的位图是正方形,否则您必须指定正确的宽度和高度,否则您的图像会根据原始宽高比而变形。我觉得这样的事情会奏效:
Bitmap scaledBitmap = Bitmap.createScaledBitmap(decodeBase64(bitmap);
bitmap = BitmapBase64Util.encodeToBase64(scaledBitmap, scaledBitmap.getWidth(), size.getHeight(), false);
如果您需要压缩以缩小尺寸,请使用此[编辑:您已完成此操作]:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
答案 1 :(得分:0)
我更新了我的代码,现在效果更好。
- 修复 -
我不是连续调整位图字符串的大小,而是使用调整大小之前使用的orignal位图。
private String RescaleImage(String bitmap, Bitmap origin_bitmap, int size) {
try {
if ((float) bitmap.getBytes().length / 1000 <= Constants.PROFILE_IMAGE_LIMITED_SIZE) {
return bitmap;
} else {
//Rescale
Log.d("msg", "rescale size : " + size);
size -= 1;
bitmap = BitmapBase64Util.encodeToBase64(Bitmap.createScaledBitmap(origin_bitmap, size, size, false));
return RescaleImage(bitmap, origin_bitmap, size);
}
} catch (Exception e) {
return bitmap;
}
}
此外,在解码时使用此代码以重用失真。 Bad image quality after resizing/scaling bitmap
如果有更好的解决办法,我总是欢迎为了改进。