我使用这个(下面)代码从SD卡上的图片创建了一个base64字符串,它可以正常工作,但是当我尝试解码它时(甚至在下面),我得到一个java.lang.outOfMemoryException
,大概是因为我在我编码之前,我没有将字符串拆分为合理的大小。
byte fileContent[] = new byte[3000];
StringBuilder b = new StringBuilder();
try{
FileInputStream fin = new FileInputStream(sel);
while(fin.read(fileContent) >= 0) {
b.append(Base64.encodeToString(fileContent, Base64.DEFAULT));
}
}catch(IOException e){
}
上面的代码效果很好,但是当我尝试使用以下代码解码图像时会出现问题;
byte[] imageAsBytes = Base64.decode(img.getBytes(), Base64.DEFAULT);
ImageView image = (ImageView)this.findViewById(R.id.ImageView);
image.setImageBitmap(
BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
);
我也尝试过这种方式
byte[] b = Base64.decode(img, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
image.setImageBitmap(bitmap);
现在我假设我需要将字符串拆分为像我的图像编码代码一样的部分,但我不知道如何去做。
答案 0 :(得分:13)
您需要在像AsyncTask这样的后台线程中解码图像 要么 您需要使用BitmapFactory降低图像质量。 例如:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inPurgeable=true;
Bitmap bm = BitmapFactory.decodeFile("Your image exact loaction",options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
答案 1 :(得分:1)
你有两个问题
以同样的方式,您的第一种方法解决了这个问题。所以只需使用该版本
通过这种方式,你为什么使用 decodeByteArray 而不是 decodeFile
答案 2 :(得分:1)
您可能会尝试解码为临时文件并从该文件创建图像。
对于base64,每个字符为6位,或者每4个字符为6x4 = 24位= 3个字节。 因此,如果你使用base64的4个字符,你将不会破坏相应的3个字节。 也就是说,您可以将base64编码的数据拆分为4的倍数的字符索引。