Отображение картинок в рамках мобильной платформы

Опубликовал Николай Беляев (freez1301) в раздел Программирование - Работа с интерфейсом

Решение проблемы с отображением картинок в формате JPEG в рамках мобильной платформы. Показ "тяжелых" картинок и анимации.

Всех приветствую!

Столкнулся с проблемой отображения картинок в формате JPEG на мобильной платформе версии 8.3.8.70. Картинку с сервера мобильная платформа получала, но на форме никак не отображалась. Картинку отображал стандартно - реквизит формы с типом строка, связанный с ним элемент формы с типом Картинка (более подробно можно узнать немного погуглив).

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

В данном случае картинки хранятся на сервере, поэтому на сервере картинку получаем в виде двоичных данных, пакуем, сериализуем и отправлем клиенту. Клиент десериализует распаковывает и двоичные данные записывает во временный файл. Вот код, решение крайне простое.

Сервер:

ДвоичныеДанные    = Новый ДвоичныеДанные(<ПутьККартинке>);
ХранилищеКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));

Клиент:

ДвоичныеДанные = ХранилищеКартинки.Получить();
ВременныйФайл  = ПолучитьИмяВременногоФайла();
ДвоичныеДанные.Записать(ВременныйФайл);

ИнфоHTML = "<html>
                |<head>
                |<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
                |</head>
                |<body>
                |<img src = " + ВременныйФайл + ">
                |</body>
                |</html>";

Также на клиенте при закрытии формы, в которой отображается картинка, необходимо убрать за собой временный файл путем метода УдалитьФайлы().

Для отображения картинки на форме используем HTML-поле (ИнфоHTML в коде), в котором атрибуту src тега <img> (отвечает за вывод изображения)  присваиваем значение пути к временному файлу. ВСЕ. В результате jpg отображается без проблем, кроме того, размер его может быть очень большим - в качестве теста попробовал фото, размером 11Мб, все отработало как нужно. Также в данном способе нет особой необходимости регулировать размеры изображения, т.к. это можно делать двумя пальцами (уменьшать/растягивать). Ну, и что совсем обрадовало - GIF анимация тоже работает без нареканий.

Ниже гифка, записанная с экрана телефона.

См. также

Комментарии
1. Антонио Антонио (Fragster) 668 19.04.17 16:44 Сейчас в теме
Для небольших картинок можно через dataURLсделать, без временного файла, примерно так:
&НаСервереБезКонтекста
Функция ПолучитьDataUrlКартинки(Знач Картинка)
	Если Картинка = Неопределено Тогда
		Картинка = Новый Картинка;
	КонецЕсли;
	Стр = Base64Строка(Картинка.ПолучитьДвоичныеДанные());
	Стр = СтрЗаменить(Стр, Символ(10), "");
	Стр = СтрЗаменить(Стр, Символ(13), "");
	Возврат Стр;
КонецФункции
...Показать Скрыть



и выводить в html так:
data:image/png;base64,тутбэйз64данные
2. Николай Беляев (freez1301) 145 19.04.17 16:57 Сейчас в теме
(1) Когда в базе несколько десятков тысяч картинок - сложно сказать, что все они будут небольшими. Однако, за идею спасибо, буду знать.
3. Виталий Барилко (Diversus) 2257 20.04.17 10:03 Сейчас в теме
Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных(9));

Зачем сжимать картинки? Если там PNG, JPG или GIF (а там именно они) то они уже идут сжатыми.
Сжатие уже сжатых данных, не дает ничего кроме увеличения времени на сжатие и размера исходных данных.
4. Николай Беляев (freez1301) 145 20.04.17 10:11 Сейчас в теме
(3) со временем согласен, но вот размер все таки уменьшается. Если зиповать картинку с ультра-сжатием, то с 11Мб лично у меня сжимается до 10700Кб, то есть 300Кб ужалось. С мелкими выигрыш тоже есть. Так что каждый сам для себя решит - сжимать и выиграть чуть-чуть трафика, но потерять во времени или не сжимать.
Поправьте, если ошибаюсь, но ХЗ и зип по сути тоже самое
5. Валерий Карпов (Yakud3a) 21.04.17 09:24 Сейчас в теме
(4) Я может что то не понимаю, картинка уже на устройстве, какой выигрыш в трафике? Вы скачали 11мб на телефон, сжали, запихали во временное хранилище, потом вытащили от туда, потом снова сохранили на телефон.... Картинка уже на устройстве, так для чего этот изврат?
6. Николай Беляев (freez1301) 145 21.04.17 11:45 Сейчас в теме
(5)
В данном случае картинки хранятся на сервере, поэтому на сервере картинку получаем в виде двоичных данных, пакуем, сериализуем и отправлем клиенту.
из публикации.
Картинки не хранятся на телефоне
Оставьте свое сообщение