【问题标题】:Android Base64 encodingAndroid Base64 编码
【发布时间】:2016-01-19 05:10:39
【问题描述】:
public String encodeTobase64(Bitmap image){
    System.gc();  //For memory efficiency
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    String imageEncoded = null;
     imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
    return imageEncoded;
}

我可以将字节数组分成多个部分,然后在不同的线程上对它们运行编码,以便可以快速处理较大的图像,然后最后加入它们。

【问题讨论】:

  • 你能准确解释你想要达到的目标吗?我认为这对您的要求没有任何好处

标签: java android performance base64


【解决方案1】:

您忘记在将位图转换为字节数组之前对其进行解码。

添加以下行

 Bitmap bm = BitmapFactory.decodeFile(image);

之后

System.gc();  //For memory efficiency

所以你的代码如下:

    public String encodeTobase64(Bitmap image){

    System.gc();  //For memory efficiency
    Bitmap bm = BitmapFactory.decodeFile(image);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
    byte[] b = baos.toByteArray(); 
    String imageEncoded = null;
    imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
    return imageEncoded;
}

【讨论】:

    【解决方案2】:

    要部分编码 base64,首先您需要了解 base64 编码的工作原理。检查下面的网址。

    1. http://www.hcidata.info/base64.htm

    2. https://blogs.oracle.com/rammenon/entry/base64_explained

    例如在字符串的情况下。 您只需要将字符串数组划分为大小为 3 的数组 例如,如果您想在 base64 中转换“12345678aa”,那么

    按以下顺序转换

    1. 123 - MTIz
    2. 456 - NDU2
    3. 78a - Nzhh
    4. a - YQ==

    现在只需合并您的结果。这将成为“MTIzNDU2NzhhYQ==”。是“12345678aa”的编码值。

    切…………:)

    【讨论】:

      【解决方案3】:

      如果您一次以 3 的倍数处理字节,则实际上可以如 this post 所示。

      否则,由于 Base64 算法的工作方式,这将不起作用。当您拆分数组时,每个段可能有或多或少的填充,因此当您最后将String 加入在一起并尝试执行反向操作(回到byte[])时,它可能会失败。

      这是一个小例子:

      String test = "This is a test";
      byte[] testBytes = test.getBytes();
      int mid = testBytes.length / 2;
      
      byte[] part1 = Arrays.copyOfRange(testBytes, 0, mid);
      byte[] part2 = Arrays.copyOfRange(testBytes, mid, testBytes.length);
      
      Encoder base64Encoder = Base64.getEncoder();
      System.out.println(base64Encoder.encodeToString(testBytes));
      System.out.println(base64Encoder.encodeToString(part1));
      System.out.println(base64Encoder.encodeToString(part2));
      

      这将输出:

      VGhpcyBpcyBhIHRlc3Q=
      VGhpcyBpcw==
      IGEgdGVzdA==
      

      请注意,如果将后两个 Strings 放在一起,它们不等于第一个。 = 字符是填充。

      如果您担心 Base64 编码图像的效率,您可以在单个后台线程上执行操作。您可以使用AsyncTask 作为一种选项来帮助您这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 2011-07-16
        相关资源
        最近更新 更多