Android位图到Base64string
如何将大的位图(使用手机相机拍摄的照片)转换为Base64string?
使用下面的方法将位图转换为字节数组:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream .toByteArray();
从字节数组编码base64使用以下方法
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
jeet的答案的问题是,您将图像的所有字节加载到一个字节数组中,这可能会使应用程序在低端设备中崩溃。 相反,我会先将图像写入一个文件,然后使用Apache的Base64InputStream类读取它。 然后,您可以直接从该文件的InputStream中创buildBase64string。 它看起来像这样:
//Don't forget the manifest permission to write files final FileOutputStream fos = new FileOutputStream(yourFileHere); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.close(); final InputStream is = new Base64InputStream( new FileInputStream(yourFileHere) ); //Now that we have the InputStream, we can read it and put it into the String final StringWriter writer = new StringWriter(); IOUtils.copy(is , writer, encoding); final String yourBase64String = writer.toString();
正如你所看到的,上面的解决scheme直接与数据stream协同工作,避免了将所有字节加载到一个variables中的需要,从而使得内存占用更低,不太可能在低端设备中崩溃。 还有一个问题,即将Base64string本身放入Stringvariables中并不是一个好主意,因为它可能会导致OutOfMemory错误。 但至less我们通过消除字节数组将内存消耗减less了一半。
如果你想跳过写入到文件的步骤,你必须将OutputStream转换为InputStream,这不是很直接的做法(你必须使用PipedInputStream,但是这样会更复杂一些,因为两个stream必须总是在不同的线程)。
我有快速的解决scheme。 只需创build一个ImageUtil.java
文件
import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Base64; import java.io.ByteArrayOutputStream; public class ImageUtil { public static Bitmap convert(String base64Str) throws IllegalArgumentException { byte[] decodedBytes = Base64.decode( base64Str.substring(base64Str.indexOf(",") + 1), Base64.DEFAULT ); return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); } public static String convert(Bitmap bitmap) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT); } }
用法:
Bitmap bitmap = ImageUtil.convert(base64String);
要么
String base64String = ImageUtil.convert(bitmap);
使用getPixels将Bitmap作为字节数组使用。 然后你可以使用Base64.encodeToString来进行编码。 这将只适用于API级别8和更大。 看到这个问题的旧设备。
试试这个,先将图像缩放到所需的宽度和高度,只需将原始位图,所需宽度和所需高度传递给以下方法,并返回缩放的位图:
例如:Bitmap scaledBitmap = getScaledBitmap(originalBitmap,250,350);
private Bitmap getScaledBitmap(Bitmap b, int reqWidth, int reqHeight) { int bWidth = b.getWidth(); int bHeight = b.getHeight(); int nWidth = bWidth; int nHeight = bHeight; if(nWidth > reqWidth) { int ratio = bWidth / reqWidth; if(ratio > 0) { nWidth = reqWidth; nHeight = bHeight / ratio; } } if(nHeight > reqHeight) { int ratio = bHeight / reqHeight; if(ratio > 0) { nHeight = reqHeight; nWidth = bWidth / ratio; } } return Bitmap.createScaledBitmap(b, nWidth, nHeight, true); }
现在只需将缩放的位图传递给以下方法,并返回base64string:
例如:String base64String = getBase64String(scaledBitmap);
private String getBase64String(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageBytes = baos.toByteArray(); String base64String = Base64.encodeToString(imageBytes, Base64.NO_WRAP); return base64String; }
要将base64string解码回位图图像:
byte[] decodedByteArray = Base64.decode(base64String, Base64.NO_WRAP); Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedByteArray, 0, decodedString.length);