Android Bitmap для Base64 String

Как преобразовать большой битмап (фото, сделанный с помощью камеры телефона) в строку Base64?

используйте следующий метод для преобразования битмапа в массив байтов:

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); 
  • Доступны ли значения, определенные в MANIFEST.MF программно?
  • Как программно установить атрибут стиля в представлении
  • Ошибка java.lang.StackOverFlow. Подозревали слишком много просмотров?
  • Если я назову getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0
  • Можно ли изменить цвет текста в строке на несколько цветов в Java?
  • Загрузить изображение с url в уведомлении Android
  • Тема / Стиль не применяется, когда надуватель используется с ApplicationContext
  • Как работает BreakIterator в Android?
  • Android ListView текущее местоположение прокрутки Y пикселей
  • android: выключить экран, когда он близок к лицу
  • Android: изменение фонового цвета активности (основной вид)
  • Interesting Posts

    Как хранится плавающая запятая? Когда это имеет значение?

    Как подключиться к потерянному экрану (отсоединенный, отсутствующий сокет)?

    Как установить сервер по умолчанию для помощников URL-адресов в рельсах?

    Различия между std :: make_unique и std :: unique_ptr

    Перенаправление на admin Сохранить

    весенний контекст приложения загрузки junit для тестов

    Как изменить переменную, к которой относится ссылка C ++?

    чертеж / screen.css не предварительно скомпилирован

    Как настроить макет, когда появляется мягкая клавиатура

    Есть ли что-то вроде общего списка в Cocoa / Objective-C?

    Зачем использовать наследование вообще?

    Selenium ждет загрузки контента Ajax – универсальный подход

    При чтении CSV-файла с использованием DataReader и поставщика данных OLEDB Jet, как я могу управлять типами данных столбцов?

    Пользовательские атрибуты в styles.xml

    Как вы можете тестировать частные методы?

    Давайте будем гением компьютера.