Android сохраняет большие растровые изображения

26.04.2019

Я новичок в android и я смущен тем, как бороться с Bitmaps .

Я хочу загрузить Bitmap , он может быть довольно большим и сохранить его во временном внутреннем файле. Затем я собираюсь сделать этот Bitmap на Canvas позже.

Мой текущий метод состоит в 1. Загрузите входной поток 2. скопируйте поток 3. используйте один поток для выполнения границ с помощью bitmapFactory.options 4. используйте другой поток для декодирования полного растрового изображения с размером выборки

Тем не менее, мне нужны landscape и portrait версии, поэтому теперь мне придется сделать это дважды и сохранить два изображения.

Или - я видел, как люди используют bm.compress(Bitmap.CompressFormat.JPEG, 50, bos); для сохранения файла. Это обходит декодирование с размером выборки в качестве сохраненного непосредственно из потока. Думаю, тогда я бы использовал матрицу для масштабирования, когда я рисую на моем Canvas .

В принципе, я смущен как лучший подход для этой задачи, какой метод с меньшей вероятностью выйдет из памяти и является наиболее часто используемым подходом?

2 ответов

Byte imagesByte = getLogoImage(Your url);

установить для просмотра изображений...

ImgView.setImageBitmap(BitmapFactory.decodeByteArray(imagesByte, 0, imagesByte.length));

Способ загрузки

Public static byte getLogoImage(String url){ try { URL imageUrl = new URL(url); URLConnection ucon = imageUrl.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(500); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } return baf.toByteArray(); } catch (Exception e) { Log.d("ImageManager", "Error: " + e.toString()); } return null; }

В Android вам нужно знать ограниченную память, поэтому большие изображения не будут вписываться в память, и у вас будут исключения OutOfMemory.

Ключ состоит в том, что после сохранения изображения во внутреннем хранилище загрузите его с разрешением дисплея:

Сначала загрузите изображение te, это должно быть сделано за пределами потока пользовательского интерфейса, пусть _url URL адрес с добавлением изображения и _file содержит содержащий файл назначения String:

URLConnection conn = _url.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); boolean success = false; //track succesful operation if(_file != null) { try { FileOutputStream fos = new FileOutputStream(_file); byte data = new byte; //use 4086 bytes buffer int count = 0; while ((count = is.read(data)) != -1) { fos.write(data, 0, count);//write de data } is.close(); fos.flush(); fos.close(); int len = conn.getContentLength(); File f = new File(_file);//check fie length is correct if(len== f.length()) { success = true; } else { //error downloading, delete de file File tmp = new File(_file); if(tmp.exists()) { tmp.delete(); } } }catch (Exception e) { try { e.printStackTrace(); //delete file with errors File tmp = new File(_file); if(tmp.exists()) { tmp.delete(); } } catch (Exception ex) { ex.printStackTrace(); } } finally { is.close();//cleanup }

Затем, когда вам нужно загрузить изображение с требуемым разрешением, здесь используется BitmapFactory для чтения информации о растровых изображениях и получения масштабированного растрового изображения:

Public static Bitmap bitmapFromFile(int width, int height, String file) { Bitmap bitmap = null; final BitmapFactory.Options options = new BitmapFactory.Options(); if(height >0 && width > 0) { options.inJustDecodeBounds = true;//only read bitmap metadata BitmapFactory.decodeFile(file,options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, width, height); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; } try { bitmap = BitmapFactory.decodeFile(file, options);//decode scaled bitmap }catch (Throwable t) { if(bitmap != null) { bitmap.recycle();//cleanup memory, very important! } return null; } return bitmap }

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) { final int halfHeight = height; final int halfWidth = width; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((couldShrink(halfWidth, reqWidth, inSampleSize)&& couldShrink(halfHeight,reqHeight, inSampleSize)) //&&(halfHeight*halfWidth)/inSampleSize > maxsize)) { inSampleSize *= 2; } } return inSampleSize; } private static boolean couldShrink (int dimension, int req_dimension, int divider) { int actual = dimension / divider; int next = dimension / (divider*2); int next_error = Math.abs(next - req_dimension); int actual_error = Math.abs(actual-req_dimension); return next > req_dimension || (actual > req_dimension && (next_error < actual_error)) ; }

То есть, если вы хотите сделать это вручную, я рекомендую вам использовать Picasso, который будет обрабатывать догрузку, кэширование диска и кэширование памяти вашего изображения:

Чтобы загрузить image с image ImageView, показывающее backgroud (R.drawable.img_bg) при загрузке:

Picasso.with(image.getContext()) .load(url).placeholder(R.drawable.img_bg).fit() .into(image, new Callback.EmptyCallback() { @Override public void onSuccess() { holder.progress.setVisibility(View.GONE); //hide progress bar } @Override public void onError() { holder.progress.setVisibility(View.GONE); //hide progress bar //do whatever you design to show error } });

для обработки растрового изображения:

//first declare a target _target = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { //handle your bitmap (store it and use it on you canvas } @Override public void onBitmapFailed(Drawable errorDrawable) { //handle your fail state } @Override public void onPrepareLoad(Drawable placeHolderDrawable) {//for example for drawing a placeholder while downloading } };

Теперь вам просто нужно загрузить и изменить размер изображения:

Picasso.with(context).load(url).resize(192, 192).centerCrop().into(_target);

Переслать файл кому-либо по интернету можно массой способов и всякий, кто это делает, выбирает самый очевидный способ — отправить по электронной почте. Но тут есть ограничение на размер файла, обычно 25 мБ, некоторые программы в формате.exe вряд ли получится переслать из-за ограничений безопасности. Разве что поместив их в архив. Многие используют для передачи скайп, тут ограничений на размер файла нет, но передача идет не очень быстро, в независимости от скорости сети. Я так никогда и не дожидался конца передачи больших файлов, а воспользовался другими инструментами, о которых и расскажу ниже.

Передача с помощью облачных сервисов

Облака уже достаточно давно вошли в нашу жизнь и очевидно это самый понятный способ передачи любых файлов. У всех популярных почтовых сервисов есть свое облако.


У Gmail это Google Drive – изначально доступно 15 гБ бесплатно, отличная интеграция со всеми сервисами google и отличная скорость.У Яндекс почты есть свой диск на 10 гБ с возможностью расширения. Установите на смартфон приложение яндекс диск и включите автозагрузку фото, получите +32 гБ. Есть интересная фишка скриншоты, которая сохраняет их сразу в Яндекс Диск. С возможностью редактирования и оформления сделанных снимков экрана.Почта от Майл может похвастаться облаком на 50 гБ для новых пользователей, раньше можно было зарезервировать 100 гБ, это, пожалуй, все достоинства.Самое безопасное на данный момент облако Mega с 50 гБ бесплатно, шифрованием файлов, классным интерфейсом и приличной скоростью.

Не упомянул самый популярный основополага ющий Dropbox только потому, что его скудные 2 гБ изначально не годятся для передачи больших файлов. Да и существует масса различных облаков с разными условиями я рассказал на мой взгляд о самых популярных в рунете.

Передача файлов таким способом имеет ряд преимуществ и недостатков:

Передача в окне браузера

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

Dropmefiles.com

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


  • Перетащите нужный файл или папку в окно браузера, нажмите чтобы выбрать на компьютере или используйте ctrl+v, чтобы вставить из буфера обмена.
  • Копируйте ссылку, чтобы отправить удобным для вас способом. Или отправляйте сразу по почте добавляя сообщение до 140 символов.
  • Храните до 14 дней файл на сервисе или пересылайте напрямую не закрывая окно браузера.
  • Возможность установить пароль, буквенный или числовой.
  • Скорость сервиса вполне хорошая, конечно с оглядкой на вашего провайдера.

File.pizza

Очень простой сервис передачи любых файлов напрямую из браузера, передача возможна только когда окно открыто. И до того момента как по полученной ссылке файл не будет скачан. Если вам нужно отправить файл нескольким пользователям, придется делать это каждый раз лично. Это особенности технологии вы передаете файл напрямую, не загружая на сторонний сервер.

  • Файл отправляется напрямую, исключая загрузку на сервер, p2p соединение как торрент.
  • Выбрать или перетащить в окно браузера нужный файл для передачи.
  • Не работает в мобильном safari.
  • В остальном, прелестно и безопасно.

BitTorrent sync

Ваша персональная торрент сеть, для работы которой необходимо наличие клиента bittorent sync, благо есть поддержка ВСЕХ платформ, включая накопители и прочие облачные устройства. Возможности по обмену и передаче файлов у программы внушительны, подробно и очень понятно можно почитать . Скажу, что скорость и правда хороша, шифрование и передача файла напрямую делают этот способ особенно привлекательным. Омрачает столь радужные восхваления лишь два аспекта: неприличная цена 2499 руб./год за PRO версию (хотя можно и обойтись FREE версией) и немного запутанное управление для неопытного пользователя.


Анонимный способ

Совершенно удивительный бесплатный и анонимный сервис anonymousfiles.io передачи файлов до 5 Гб. Перетащите или выберете файлы на компьютере. Получите ссылку, поделитесь ссылкой .


Удалить загруженные файлы нельзя, но можно определить время их жизни до 6 месяцев. Никаких логов и ограничений для загрузки и скачивания. Удивительный и бесплатный способ безопасного обмена.

Мнение

С каждым днем мы приближаемся к тому что большую часть задач мы выполняем в браузере, переброс больших файлов по сети тоже перебрался в окно браузера, переместился в облако или как в случае с bittorent sync освоил p2p сети и шифрование ключами. Потоки движутся в 21 веке с невероятно скоростью и масштабами, а инструментов для этого человечество придумало предостаточно!

Если вы знаете о других, которые принципиально отличаются от представленных, пишите в комментариях — будет интересно!

Что такое большие данные? Ответ на этот вопрос зависит от того, кому и когда он задан. Возьмем обычного пользователя: пятнадцать лет назад объём данных в среднем домашнем компьютере исчислялся несколькими гигабайтами; теперь таких гигабайт сотни и даже тысячи. Более серьезный пример: датчики, установленные на Boeing Jet, генерируют примерно 10 ТБ данных с каждого двигателя всего лишь за 30 мин. То есть самолет, прилетевший из Москвы, скажем, в Новосибирск за 4 часа, даст нам примерно 160 ТБ данных. И это только с одного полета. На десерт можно подсчитать, сколько данных оставила человечеству прошедшая Олимпиада в Сочи: сотни спортсменов и данные о них, тысячи часов видео с соревнований, данные с камер слежения и т. д.

Большие данные – это одновременно большие проблемы и большие возможности. Рассмотрим несколько типичных проблем, связанных с «Big data».

  • Объём. Как мы только что заметили, данных очень много и их объём постоянно растет. Это требует принципиально новых устройств и алгоритмов для хранения информации.
  • Скорость. Сами по себе данные почти бесполезны, если их не обрабатывать, причем обрабатывать быстро. Кстати, скорость – понятие весьма относительное, и то, что для одних данных – очень быстро, для других будет непозволительно медленно.
  • Неоднородность. Данные могут быть самыми разными: по важности, скорости обновления, дополнения и т. п. Всё это требует разных форматов хранения.
  • Безопасность. Данные не должны теряться; несанкционированный доступ к ним также нежелателен.
Этот список можно продолжать, однако любая проблема – обратная сторона возможностей. Компания Amazon, известная своим онлайн-магазином, только в 2013 году заработала на своих облачных сервисах около 4 млрд долларов. В 2014 году, по разным оценкам, эта сумма может составить от 6 до 10 млрд.

Как хранить большие данные. Базовые подходы

Существует три способа хранения цифровых данных:
  • Традиционный: «где-то у себя» – на дисках, лентах, локальных хранилищах и т. д.;
  • В публичных «облаках»: от таких гигантов, как Amazon, Microsoft и Google или от компаний поменьше;
  • В частных «облаках»: вариант, более характерный для корпоративного сегмента; хранилище входит в инфраструктуру компании и доступно только её сотрудникам.
Разберём некоторые плюсы и минусы этих подходов.

▍Хранение «у себя»

Наиболее привычно для большинства из нас. Информация записывается на локальные хранилища – диски, RAID массивы, ленты и пр.

Плюсы

  • Это привычно. Данные всегда рядом, и нам так спокойнее.
  • Скорость доступа. Как правило, к локальному носителю можно легко и быстро подключиться.
  • Цена. Хотя она может быть и минусом.

Минусы

  • Ненадёжность. Диски и серверы выходят из строя в результате физического износа. Каким бы надежным ни был сервер, он не защитит данные от природных катаклизмов или от банального воровства.
  • Доступ к данным. Издалека отсутствует, неудобен, или, как минимум, не всегда безопасен.
  • Масштабирование. Его возможности, как правило, ограничены. Нужно покупать новые носители и где-то их размещать. Что если сегодня вам надо 10 Тб, завтра – всего лишь 5, а послезавтра – все 50?

▍Публичные облака

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

Плюсы

  • Это удобно. Компании максимально упрощают базовые сценарии работы.
  • Относительно безопасно. Большинство вендоров защищает данные не только пользовательским паролем, но и собственными алгоритмами шифрования.
  • Довольно дёшево. Цены в больших публичных «облаках» колеблются на уровне 5-10 центов за гигабайт в месяц, и есть явная тенденция к их снижению: достаточно вспомнить недавнее изменение ценовой политики для Google Drive.
  • Относительно надёжно. Даже в случае природных катастроф есть возможность географического реплицирования данных.
  • Новые горизонты в будущем. Например, быстрый и безопасный обмен данными.

Минусы

  • Психологический фактор. Ваши данные далеко от вас; вдруг кто-то ещё имеет к ним доступ?
  • Цена. Облачное хранение может показаться дороже локального. Хотя зачастую скупой платит дважды.
  • Скорость доступа. Всё-таки скорость доступа в интернет даже в передовых странах в среднем измеряется мегабайтами в секунду (что, как минимум, в десятки раз медленнее доступа в локальные хранилища).
Частные «облака» во многом похожи на публичные и при использовании в корпоративной среде могут давать ощущение большего контроля над безопасностью данных.

На этом пока всё. В следующий раз мы поговорим о различных практических способах применения «облаков».

Если Вы пользуетесь облачными хранилищами, тогда, вы наверняка знаете, что на облако можно выкладывать файлы ограниченного размера, например, на маил.ру ограничение до 2 гигабайт. В данной заметке Вы узнаете, как добавить файл любого размера, на всевозможные облачные хранилища.

Облако можно использовать разными способами. Можно воспользоваться специальным приложением, которое устанавливается на ваш компьютер, и с помощью него вы закачиваете файлы на облачное хранилище.

Но, минусом данного метода является то, что данным приложением создается определенная папка (папка облачного хранилища). Все бы ничего, но данная папка помимо того, что отправляет файлы на облако, также дублирует их на вашем компьютере. Тем самым, занимая место на жестком диске вашего компьютера.

Для того, чтобы этого не происходило, нам приходится удалять приложение, и скидывать файлы напрямую на облако с помощью браузера. Ну, лично я так делаю.

И вот тут-то мы и сталкиваемся с проблемой размера файла. Облако маил.ру не позволяет добавлять файлы размером более двух гигабайт. Что же делать? Если, например, наш файл весит 3 гигабайта? Сейчас, я расскажу, как с этим бороться.

Разбиваем файл на несколько архивов

Необходимо данный файл или фалы разбить на несколько архивов. Вы можете воспользоваться любой программой для архивирования данных. Я использую программу «7-ZIP».

  • Выделяю нужный файл.
  • Нажимаю правую кнопку мышки, по файлу.
  • Открылось контекстное меню. Навожу на пункт «7-ZIP» и выбираю «Добавить к архиву».
  • Откроется окно настроек архивации. Здесь нужно найти пункт «Разбить на тома размером (в байтах)». В данном пункте нужно выставить значение, которое позволяет добавлять файл на облако. Все зависит от того, на какое облако вы собираетесь добавлять файл. К примеру, я хочу добавить на «маил.ру», у них ограничения не более 2 гб. Значит я выставляю значение, допустим 1900 мб.
  • Дальше жмем «ОК» и начинается архивация.

Суть в том, что нужный нам файл будет разбит на несколько архивов, а размер каждого архива не будет превышать 1900 мб. Что даст нам возможность закачать все созданные архивы на облако.

Как объединить архивы, чтобы получить целую информацию

Теперь давайте рассмотрим, как нам из разбитого на архивы файла получить цельную информацию.

Допустим, вам понадобился файл, который вы закачали на облако. Как им воспользоваться?

  • Скачиваем все созданные архивы (архивы данного файла).
  • После того, как вы все скачали, выделяем все архивы, из которых состоит ваш файл. Это можно сделать, зажав левую кнопку мышки и проведя по всем архивам. Или, можете нажать левой кнопкой мышки на верхнем архиве, зажмите кнопку «Shift» и нажмите левой кнопкой мышки на самом нижнем архиве. Все файлы выделятся.
  • Кликните правой кнопкой мышки по любому из архивов, откроется контекстное меню.
  • В данном меню наведите на пункт «7-ZIP» и выберите «Распаковать здесь».

Все, после распаковки данный файл окажется в этой папке, в том виде, в котором вы его архивировали.

Таким образом, разбивая файлы на архивы, вы можете добавлять на облако любые файлы, даже огромного размера. Главное, чтобы места на облаке хватило.

Ниже представлено видео, на котором я показывал, как это все делается. Да, кстати, если у вас нет программы архиватора, тогда вы можете воспользоваться бесплатной программой «7-ZIP». Вот ссылка на её официальный сайт .

Надеюсь, данная заметка была вам полезной. или на канал «Instructor PC» .

Похожие статьи