【问题标题】:Decode Image data in Android在 Android 中解码图像数据
【发布时间】:2018-06-03 07:57:44
【问题描述】:

我对在 Android 中解码图像数据感到困惑。

以下代码无法正常工作。它收到“bad base-64”错误消息。

String c = data.getString("profile_picture").replace("\n", "");
byte [] picture_data = Base64.decode(c, Base64.DEFAULT);  // ******** ERROR (bad base-64) *******

InputStream is = new ByteArrayInputStream(picture_data);

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);

ImageView _profile_image = (ImageView)view.findViewById(R.id.image_view);
_profile_image.setImageBitmap(bmp);

我尝试了所有 Base64.* 作为解码参数。

我在 Swift 和 Javascript 中有相同的图像数据(json 字符串)的工作代码。

斯威夫特

let _profileImageView = UIImageView()
let _profile_image: UIImage? = 
registration_data["profile_picture"].string!.urlDecode()
_profileImageView.image = _clinic_image
_profileImageView.frame = CGRect(x: 10,
                             y: 10,
                             width: _cellDetailView.frame.width * 0.2,
                             height: _cellDetailView.frame.width * 0.2
)
_cellDetailView.addSubview(_profileImageView)

public func urlDecode() -> UIImage? {
    var img: UIImage = UIImage()
    let base64String = self.replacingOccurrences(of: "}", with: "+")

    let decodeBase64:NSData? =
        NSData(base64Encoded:base64String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)

    if let decodeSuccess = decodeBase64 {
        img = UIImage(data: decodeSuccess as Data)!
    }
    return img
}

Javascript

document.getElementById('profile_photo_preview').src = "data:image/jpg;base64," + decodeURI(encodeURI(jsondata.profile_picture))

我想做的是让java代码与swift和javascript中的一样。

我很快就知道,如果我删除 NSData.Base64DecodingOptions.ignoreUnknownCharacters 选项,它不会显示图像。

我该怎么做?

请给我一个建议。

【问题讨论】:

  • 为什么要从 Base64 字符串中删除 \n
  • 在swift的“NSData.Base64DecodingOptions.ignoreUnknownCharacters”文档中,似乎去掉了行结束符。
  • 在你的 Swift 代码中你不应该使用 NSData,使用它的原生 Swift 对应物,Data。此外,不要强制解开UIImage(data: decodeSuccess as Data)!,因为您可以对字符串进行base64 解码这一事实并不一定意味着它可以表示为UIImage,因此可失败初始化程序仍然可以返回nil。这尤其没有意义,因为无论如何您都返回了可选的UIImagevar img: UIImage = UIImage() 也没有任何意义,因为它让你的 func 一直返回非 nil UIImage
  • 感谢您的建议。你一定是对的。但这不是我的工作。 Swift 代码是由另一个人编写的。我的工作是编写与 swift 和 javascript 一样好用的 android 代码。

标签: javascript java android swift decode


【解决方案1】:

尝试使用编码与

java.io.ByteArrayOutputStream boas = new java.io.ByteArrayOutputStream();
Bitmap bm = ((android.graphics.drawable.BitmapDrawable) imageview1.getDrawable()).getBitmap();
bm.compress(Bitmap.CompressFormat.JPEG, 100, boas);

byte[] imageBytes = boas.toByteArray();

String img_str = Base64.encodeToString(imageBytes, Base64.DEFAULT);

和解码

byte[] decoded1String = Base64.decode(img_str, Base64.DEFAULT); Bitmap decoded1Byte = BitmapFactory.decodeByteArray(decoded1String, 0, decoded1String.length);
imageview1.setImageBitmap(decoded1Byte);

【讨论】:

  • 感谢您的建议。但是编码和上传图像文件的功能不是android代码。它是由 javascript 编写的,我无法重写此函数。我必须编写适合现有代码的代码。
  • 感谢您的回复。我想说的是,在android中没有编码和发送服务器的功能。图像通过网络上传到 javascript 函数。在android中,我唯一要做的就是显示来自服务器的图像。
猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多