我正在开发一个Android应用程序,该应用程序采用位图,将其转换为base64字符串并将其发送到后端,并将其保存为字符串。
后端的大小限制大约为1M,因此我需要在发送之前在本地调整位图大小以确保base64字符串不会超过该限制。
有没有办法,公式等知道我必须调整位图的大小才能实现给定长度的base64字符串?
我目前正以递归方式执行此操作,但这显然不是最佳解决方案。
段:
private void scaleImg(float scale) {
int newWidth = (int)(bmp.getWidth() * scale);
int newHeight = (int)(bmp.getHeight() * scale);
bmp = Bitmap.createScaledBitmap(bmp, newWidth, newHeight, true);
base64EncodedImg = PicUtils.convertBitmapToBase64String(bmp);
base64EncodedImgLength = base64EncodedImg.length();
if(base64EncodedImgLength > 1000000) {
scaleImg(scale - 0.1f);
}
}
谢谢!
答案 0 :(得分:0)
Base64增加了〜1.37倍的字节数。
您还必须考虑尺寸计算中的颜色字节。您没有说明图像是如何编码的(PicUtils.convertBitmapToBase64String()?)。我假设32位颜色未压缩(原始Android位图字节)。
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
Pair<Integer,Integer> size = fitSize((int)Math.pow(10, 6),bitmap.getWidth(), bitmap.getHeight());
bitmap = Bitmap.createScaledBitmap(bitmap, size.first, size.second, true);
byte[] bytes = getBitmapBytes(bitmap);
byte[] base64 = Base64.encode(bytes, Base64.DEFAULT);
Log.i("bitmapscaletest", "base 64 size: " + base64.length);
private Pair<Integer, Integer> fitSize(int size, int w, int h) {
double scale = 1.0;
while ((int)(w * h * 4 * 1.37) > size) {
scale -= 0.001;
w *= scale;
h *= scale;
}
return new Pair<Integer,Integer>(w, h);
}
这比你所拥有的要好,因为它实际上并没有在每次迭代时解码/重新编码位图。这可以增强以进行某种二分搜索。减小0.001以使尺寸接近10 ^ 6.