获取所需的位图宽度和高度以适合base64字符串

时间:2015-01-13 00:29:40

标签: android bitmap base64

我正在开发一个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);
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

Base64增加了〜1.37倍的字节数。

  

http://en.wikipedia.org/wiki/Base64

您还必须考虑尺寸计算中的颜色字节。您没有说明图像是如何编码的(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.