Render Image как поток данных в браузере Android
Я собрал небольшое тестовое веб-приложение, которое преобразует HTML-холст в изображение (используя Nihilogic canvas2image JavaScript-библиотека), затем заменяет холст сгенерированным изображением и отображает сообщение, уведомляющее пользователя касаться (долгого) этого изображения, чтобы сохранить его на своем телефоне.
Проблема, с которой я столкнулся, заключается в том, что веб-браузер Android по умолчанию ( "Интернет" ) не отображает поток данных с кодировкой base64, который представляет изображение, но вместо этого отображает знак вопроса. Есть ли способ разрешить это? Если да, то как?
Ответы
Ответ 1
Используйте настраиваемый ContentProvider и переопределите openFile(), чтобы вернуть поток в качестве Tempfile.
Вы можете использовать URI как src в теге html A.
<a src="Example://file"></a>
public class ExampleProvider extends ContentProvider {
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
//Get your bitmap
Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.file_example);
File tempFile = null;
try {
//Create the tempfile form a stream
tempFile = File.createTempFile("tempfile", ".thumb", getContext().getCacheDir());
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tempFile));
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.close();
if(mode.equals("r")) {
return ParcelFileDescriptor.open(tempFile, ParcelFileDescriptor.MODE_READ_ONLY);
}
}
catch(IOException e) {
LOGGER.error("Couldn't generate temp file for thumb view, guid:" + guid, e);
}
finally {
if(tempFile != null {
//The unix filesystem automatically deletes the file once all handles are gone
tempFile.delete();
}
}
}
}
Ответ 2
На основе комментария изображения @goldenparrot можно видеть с помощью
<img src="data:image/png;base64,BASE64_STRING_HERE" />
(а также с предложенным css background-image), когда данные base64 уже присутствуют при загрузке страницы. Однако по какой-то причине это не работает, когда динамически вводится точно такая же строка данных. Даже статически загруженное изображение с данными base64 имеет проблемы: оно никак не реагирует на длительный щелчок, поэтому его нельзя загрузить. Я использую Android 2.3.6.
Изменить: вы также можете попробовать добавить дополнительную ссылку для скачивания
<a href="data:application/octet-stream;base64,BASE64_STRING_HERE">download file</a>
но это не сработало для меня. Android просто показывал содержимое этого файла в виде текста. Обычный веб-браузер рабочего стола открыл диалоговое окно "скачать файл", но не предлагал расширения для этого файла, поэтому пользователь должен добавить его вручную.
См. также Browser/HTML Force загрузка изображения из src=" data: image/jpeg; base64... "
Моя тестовая html-страница http://kuitsi.bitbucket.org/stackoverflow12113616.html