Android Bitmap для Base64 String
Как преобразовать большой битмап (фото, сделанный с помощью камеры телефона) в строку Base64?
- Лучший способ сравнить даты в Android
- Как проверить подключение к Интернету в Android?
- Есть ли трансляция для изменения объема?
- Как я могу удерживать кнопку нажатой после нажатия на нее?
- Вес планшета Android
- Google Maps v2 Маркер zOrdering - установить в начало
- Как оживить Burger в Arrow с помощью Appcompat v7 21, панели инструментов и DrawerLayout
- заполняя круг постепенно снизу вверх.
используйте следующий метод для преобразования битмапа в массив байтов:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream .toByteArray();
для кодирования base64 из массива байтов используйте следующий метод
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
У меня быстрое решение. Просто создайте файл 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);
Проблема с ответом jeet заключается в том, что вы загружаете все байты изображения в массив байтов, что, скорее всего, приведет к краху приложения в младших устройствах. Вместо этого я должен сначала записать изображение в файл и прочитать его с помощью classа Base64InputStream от Apache. Затем вы можете создать строку Base64 непосредственно из InputStream этого файла. Это будет выглядеть так:
//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();
Как вы можете видеть, приведенное выше решение работает напрямую с streamами вместо этого, избегая необходимости загружать все байты в переменную, вследствие чего занимаемая площадь памяти значительно ниже и меньше вероятность сбоя в устройствах младшего classа. По-прежнему существует проблема, заключающаяся в том, что установка самой строки Base64 в переменную String не является хорошей идеей, потому что, опять же, это может вызвать ошибки OutOfMemory. Но, по крайней мере, мы сократили потребление памяти наполовину, исключив массив байтов.
Если вы хотите пропустить шаг записи в файл, вам нужно преобразовать OutputStream в InputStream, что не так просто сделать (вы должны использовать PipedInputStream, но это немного сложнее, поскольку оба streamа всегда должны быть быть в разных streamах).
Попробуйте это, сначала увеличьте изображение до требуемой ширины и высоты, просто передайте исходное bitmap, требуемую ширину и необходимую высоту для следующего метода и получите масштабированное bitmap в ответ:
Например: 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); }
Теперь просто передайте масштабированное bitmap на следующий метод и получите строку base64:
Например: 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; }
Чтобы декодировать строку base64 обратно в bitmap:
byte[] decodedByteArray = Base64.decode(base64String, Base64.NO_WRAP); Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedByteArray, 0, decodedString.length);