Вопрос по android, java, image, post – Android размещает в высоком разрешении изображение, не хватает памяти

2

Добрый день товарищи разработчики.

Я занята загрузкой изображений из приложения для Android.
Я также получил это работает (код будет следовать ниже).
Но когда я отправляю большие изображения (10 мегапикселей), мое приложение вылетает с исключением из-за нехватки памяти.
Решением для этого является использование сжатия, но что если я хочу отправить полноразмерное изображение?
Я думаю, что-то с потоком, но я не знаком с потоками. Возможно, urlconnection может помочь, но я действительно понятия не имею.

Я присваиваю файлу имя файла [от 0 до 9999] .jpg Значение сообщения с датой изображения называется Filedata Я даю UID для значения сообщения dropboxid

Приведенный ниже код работает, но я бы хотел решить мою проблему, которая не позволяет мне отправлять изображения в высоком разрешении.

С уважением

<code>try
{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 100, bos);
    byte[] data = bos.toByteArray();

    HttpPost postRequest = new HttpPost(URL_SEND);

    ByteArrayBody bab = new ByteArrayBody(data, "File" + pad(random.nextInt(9999) + 1) + ".jpg");
    MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("Filedata", bab);
    reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
    postRequest.setEntity(reqEntity);

    HttpResponse response = httpClient.execute(postRequest);
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    String sResponse;
    StringBuilder s = new StringBuilder();

    while((sResponse = reader.readLine()) != null)
    {
        s = s.append(sResponse);
    }

    if(d) Log.i(E, "Send response:\n" + s);
}
catch (Exception e)
{
    if(d) Log.e(E, "Error while sending: " + e.getMessage());
    return ERROR;
}
</code>

Ваш Ответ

1   ответ
3

ByteArrayOutputStream а потом звонит#toByteArray() вы эффективноdoubled объем памяти, который использует JPEG.ByteArrayOutputStream хранит внутренний массив с закодированным JPEG и при вызове#toByteArray() это выделяетnew массив & amp; копирует данные из внутреннего буфера.

Рассмотрите возможность кодирования больших растровых изображений во временный файл & amp; с помощьюFileOutputStream а такжеFileInputStream закодировать и отправить изображение.

Без & quot; загрузки & quot; - ваше приложение выживает "красиво" с огромным растровым изображением в памяти, которое я предполагаю?

Редактировать:FileBody

File img = new File(this is where you put the path of your image)
ContentBody cb = new FileBody(img, "File" + pad(random.nextInt(9999) + 1) + ".jpg", "image/jpg", null);
MultipartEntity reqEntity = new multipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("Filedata", cb);
reqEntity.addPart("dropboxId", new StringBody(URLEncoder.encode(uid)));
Я могу отправить практически любой тип файла, который мне нравится. Но я до сих пор не понимаю, как получить байты из файла. Но идея хороша, поэтому я думаю, что я пойду в Google. Или, если у вас есть быстрый пример, это было бы хорошо. Если я найду что-нибудь, я опубликую это. Спасибо за совет user1195015
Итак ... почему вы должны получить растровое изображение? Является ли исходный файл PNG, а веб-сервер принимает только PNG? В противном случае - просто загрузите файл, который у вас уже есть, - перекодируйте JPEG, как это, вероятно, просто привнесет в изображение больше дурацких артефактов.Edit: Вы правильно импортировали дополнительные библиотеки Apache? В этом случае вы должны иметьFileBody учебный класс. Вы можете использовать это
Ну, вы можете реализовать свой собственныйContentBody, но просто используяFileBody вместоByteArrayBody должен работать на вас.
В моем приложении я храню только ссылку на файл. Таким образом, файл уже хранится (на SD-карте). Только когда я начинаю загрузку, я получаю растровое изображение из него. Моя главная проблема заключается в том, что я понятия не имею, как я могу получить из этого файла входной поток и преобразовать его в выходной поток, который я могу опубликовать в своей сущности. Растровый код bitmap = BitmapFactory.decodeFile (path); Так что здесь я должен сделать что-то вроде ByteArrayBody bab = fileinputstream (путь)? user1195015
Большое спасибо, я собираюсь использовать его таким образом. user1195015

Похожие вопросы