【问题标题】:Encode and decode bitmap object in base64 string in AndroidAndroid中base64字符串编码和解码位图对象
【发布时间】:2012-04-03 20:18:44
【问题描述】:

我想对字符串base64 中的Bitmap 对象进行编码和解码。我用的是Android API10,

我尝试使用这种形式的方法来编码Bitmap,但没有成功。

public static String encodeTobase64(Bitmap image) {
    Bitmap immagex=image;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    byte[] b = baos.toByteArray();
    String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);

    Log.e("LOOK", imageEncoded);
    return imageEncoded;
}

【问题讨论】:

    标签: android bitmap base64


    【解决方案1】:
    public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality)
    {
        ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
        image.compress(compressFormat, quality, byteArrayOS);
        return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT);
    }
    
    public static Bitmap decodeBase64(String input)
    {
        byte[] decodedBytes = Base64.decode(input, 0);
        return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
    }
    

    示例用法:

    String myBase64Image = encodeToBase64(myBitmap, Bitmap.CompressFormat.JPEG, 100);
    Bitmap myBitmapAgain = decodeBase64(myBase64Image);
    

    【讨论】:

    • 但是服务器返回Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property的长度太长了,有没有办法克服它?? @Roman Truba
    • 图片的@Logic base64 字符串必须作为 POST 请求正文数据传递。我不认为,大图像可以适合 JSON。
    • @RomanTruba 当我使用 gson 将包含此 encodeToBase64 字符串的类转换为 json 字符串时,我得到 java.lang.OutOfMemoryError: Failed to allocate a 128887990 byte allocation with 16777216 free bytes and 70MB until OOM.How can我将这样的字符串转换为 json 字符串??
    • @KJEjava48 使用较小的图像
    • @RomanTruba 当我上传压缩图像然后将其转换为字符串时,一张图像可能需要 500kb 或 600kb 的大小,然后当我使用 gson 将其集体转换为 json 字符串时出现内存不足错误。跨度>
    【解决方案2】:

    希望对你有帮助

     Bitmap bitmap = BitmapFactory.decodeStream(this.getContentResolver().openInputStream(uri));
    

    (如果您正在引用 URI 来构建位图) 或

    Resources resources = this.getResources();
    Bitmap bitmap= BitmapFactory.decodeResource(resources , R.drawable.logo);
    

    (如果你引用drawable来构建位图)

    然后编码

     ByteArrayOutputStream stream = new ByteArrayOutputStream();  
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
     byte[] image = stream.toByteArray();
     String encodedImage = Base64.encode(image, Base64.DEFAULT);
    

    解码逻辑与编码完全相反

    byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 
    

    【讨论】:

    • 我想避免使用 BitmapFactory,因为它将 jpeg 转换为 BitMap,这将占用更多内存。任何将 jpeg / png 转换为 byte[] 和 Base64 的解决方案都适用于 Android。
    【解决方案3】:

    将 bimap 编码为图像:

     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);
       byte[] imageBytes = byteArrayOutputStream.toByteArray();
       String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        Log.d("bytearray", String.valueOf(byteArrayOutputStream.toByteArray()));
        Log.d("encodedimage",encodedImage);
    

    【讨论】:

      【解决方案4】:

      请注意,如果您从其他进程(如 JSInterface)获取 base64 字符串,该字符串将以 base64 的标头开头,如 'data:image/png;base64,',如果使用 BitmapFactory.decodeByteArray 则需要将其切断解码。

      String dataStr = thumb.startsWith("data:image") ? thumb.substring(thumb.indexOf(',') + 1) : thumb;
      byte[] decodedString = Base64.decode(dataStr, Base64.DEFAULT);
      Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 2015-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        相关资源
        最近更新 更多