2016-09-17 4 views
1

Учитывая изображение Uri, мне нужно сохранить изображение в каталоге кэша моего приложения. Я извлекаю bitmap из Uri, используя InputStream, потому что Uri может исходить от MediaStore или другого контента приложения Uri (пример Google Фото), а filePath не может быть безопасно получен во всех случаях.Вручную извлеките EXIF ​​из потока и прикрепите его к файлу JPEG

Поскольку не существует никакого способа, чтобы прочитать EXIF из InputStream или FileDescriptor в андроид Marshmallow и ниже, я использую this библиотеку, которая имеет конструктор Exif для InputStream.

То, что я хочу, когда я извлечь bitmap из Uri и записать его в JPEG файл в моем каталоге кэша, я хочу, чтобы сшить все данные EXIF я получил от InputStream к этому JPEG файлу из-за какой-то бизнес требования (ротация и lat-long в основном).

Я не могу найти правильный путь к этому, используя приведенную выше библиотеку (не очень хорошо разбирается в EXIF). Любая помощь будет высоко оценен.

ответ

1

Это неправильный подход для решения этой проблемы. Поток уже представляет собой JPG со всеми данными EXIF. Вам просто нужно скопировать поток непосредственно в кеш приложений.

Нечто подобное:

// in is the inputstream that you got from the Uri 
// dst is a file to your app internal cache 
public void copy(Uri uri, File dst) throws IOException { 
    InputStream in = contentResolver.openInputStream(uri); 
    OutputStream out = new FileOutputStream(dst); 

    // Transfer bytes from in to out 
    byte[] buf = new byte[1024]; 
    int len; 
    while ((len = in.read(buf)) > 0) { 
     out.write(buf, 0, len); 
    } 
    in.close(); 
    out.close(); 
} 

После выполнения копия оригинального JPG сохраняется в локальном кэше приложения, включая все его EXIF. После этого, если вы хотите растровое изображение (чтобы показать на экране, применить эффекты или что-то еще), вы загрузите растровое изображение из копии JPG.

 Смежные вопросы

  • Нет связанных вопросов^_^