Привет, я хотел загрузить изображения с высоким разрешением на свой php-сервер. Теперь я отправляю изображения на свой сервер с использованием закодированной строки. Проблема здесь: я не могу загрузить изображение с высоким разрешением, это приводит меня к Out памяти. Мое изображение размером около 1-2 МБ. Вот фрагмент, как я загружаю изображение на сервер.Загрузка изображений с высоким разрешением в android
String encodedPagerpath="";
if(!FILE_PAGER_PATH.equals("") && FILE_PAGER_PATH.length()!=0)
{
byte [] b=imageTobyteArray(FILE_PAGER_PATH,150,150);
if(b!=null)
{
encodedPagerpath=Base64.encodeToString(b, Base64.DEFAULT);
if(encodedPagerpath==null || encodedPagerpath.equals("")){
encodedPagerpath="";
}
}
}
//Convert image into byte array
static byte[] imageTobyteArray(String path,int width,int height)
{ byte[] b = null ;
if(!path.equals("") || path.length()!=0)
{
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inDither=true;//optional
options.inPreferredConfig=Bitmap.Config.RGB_565;//optional
Bitmap bm = BitmapFactory.decodeFile(path,options);
options.inSampleSize = calculateInSampleSize(options, width, height);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
bm=BitmapFactory.decodeFile(path,options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 70, baos); //bm is the bitmap object
b= baos.toByteArray();
}
return b;
}
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height/(float) reqHeight);
final int widthRatio = Math.round((float) width/(float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
Я отправляю эту закодированную строку в объект json. Есть ли лучший подход, на который я могу пойти? Если я выйду за пределы 150X150, это приведет меня к OOM. Я хочу загрузить файл с высоким разрешением без потери его качества.
Не загружайте большие изображения в качестве base64, а отправляйте массив байтов: откройте выходной поток на свой сервер, откройте входной поток в растровое изображение, а затем прочитайте куски данных из входного потока, напишите их в выходной поток , Таким образом, размер растрового изображения не имеет значения. Я отправил этот образ на 60 МБ. – gunar
@gunar вы можете вставить пример кода для этого? и нужно ли загружать изображение отдельно? вместо того, чтобы помещать его в объект json? – Manoj
В Интернете полно этого: google для '' and bit post bitmap byte array''. Не отправляйте json, так как вы будете вынуждены использовать base64 таким образом. Создайте API на стороне сервера, который знает, как обращаться с типами изображений «image/*». – gunar