Предисловие:
Данные изображения клиента мобильного телефона Android загружаются на сервер для хранения.Сначала данные изображения клиента необходимо преобразовать в формат Base64, а затем их можно загрузить на сервер через сеть.
Есть два способа добиться этого:
Позвольте клиенту загрузить изображение на сервер и сообщить серверу сетевой URL-адрес изображения.
Преобразуйте изображение в кодировку Base64 и передайте его на сервер, а сервер сгенерирует изображение после декодирования строки Base64.
Эта статья посвящена преобразованию изображений в Base64.
Android предоставляет класс android.util.Base64 в пакете util.
Этот класс предоставляет четыре метода кодирования, а именно:
public static byte[] encode(byte[] input, int flags)
public static byte[] encode(byte[] input, int offset, int len, int flags)
public static String encodeToString(byte[] input, int flags)
public static String encodeToString(byte[] input, int offset, int len, int flags)
Обеспечивает три декодирования
public static byte[] decode(String str, int flags)
public static byte[] decode(byte[] input, int flags)
public static byte[] decode(byte[] input, int offset, int len, int flags)
Мы обнаружили, что каждый из четырех методов кодирования имеет параметр flags, который является флагом кодирования или стандартом кодирования.
Стандарты кодирования следующие:
CRLF
Символ новой строки в стиле Win означает использование пары CR и LF в качестве конца строки вместо LF в стиле Unix.
CRLF — это сокращение от Carriage-Return Line-Feed, что означает возврат каретки (\r) и перевод строки (\n).
То есть идентификатор конца строки в стиле Windows — \r\n, а идентификатор конца строки в стиле Unix — \n.
ПО УМОЛЧАНИЮ
Этот параметр используется по умолчанию, используйте метод по умолчанию для шифрования
NO_PADDING
Этот параметр позволяет опустить «=» в конце зашифрованной строки.
NO_WRAP
Этот параметр означает отсутствие всех разрывов строк (после установки CRLF бесполезен)
URL_SAFE
Этот параметр означает, что символы, имеющие особое значение для URL-адресов и имен файлов, не используются в качестве зашифрованных символов при шифровании, в частности, замена + и / на - и _.
NO_CLOSE
Обычно используемый с `Base64OutputStream`, это флаг, передаваемый `Base64OutputStream`, чтобы указать, что он не должен закрывать переносимый поток вывода.
Код для преобразования изображения в Base64 выглядит следующим образом:
/**
* 将图片转换成Base64编码的字符串
*/
public static String imageToBase64(String path){
if(TextUtils.isEmpty(path)){
return null;
}
InputStream is = null;
byte[] data = null;
String result = null;
try{
is = new FileInputStream(path);
//创建一个字符流大小的数组。
data = new byte[is.available()];
//写入数组
is.read(data);
//用默认的编码格式进行编码
result = Base64.encodeToString(data,Base64.NO_CLOSE);
}catch (Exception e){
e.printStackTrace();
}finally {
if(null !=is){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
Код преобразования изображения Base64 выглядит следующим образом:
/**
* 将Base64编码转换为图片
* @param base64Str
* @param path
* @return true
*/
public static boolean base64ToFile(String base64Str,String path) {
byte[] data = Base64.decode(base64Str,Base64.NO_WRAP);
for (int i = 0; i < data.length; i++) {
if(data[i] < 0){
//调整异常数据
data[i] += 256;
}
}
OutputStream os = null;
try {
os = new FileOutputStream(path);
os.write(data);
os.flush();
os.close();
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
}catch (IOException e){
e.printStackTrace();
return false;
}
}