Как изменения приложения галереи применяются к изображениям?

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

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

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

Я решил подключить устройство к компьютеру с помощью USB-кабеля. Я перешел к папке камеры и открыл изображение на компьютере, и оно показало измененное изображение. Это означает, что изображение изменяется. Пока устройства были еще подключены к компьютеру, я решил убрать фильтр и снова открыть изображение на компьютере. Изображение вернулось к исходному.

Как Android может напрямую изменять файл изображения, а затем восстанавливать его до исходного состояния. Сохраняет ли исходный файл где-то еще?

Как воспроизвести:

  1. Откройте приложение Галерея (по умолчанию)
  2. Выберите изображение для редактирования и коснитесь маленького карандаша в левом нижнем углу экрана.
  3. Отредактируйте изображение, коснитесь кнопки «Сохранить» или просто нажмите кнопку «Назад». Он спросит, хотите ли вы сохранить изображение. Сохрани это.
  4. Коснитесь карандаша еще раз, удалите фильтр.
  5. Ваше изображение возвращается к исходному.

Устройство: Нексус 7

ОС: Андроид 4.4.2

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

Ответы (1)

Вы можете найти исходный код этого приложения в пакете Gallery2 в AOSP . Весь код фоторедактора находится в формате src/com/android/gallery3d/filtershow. Сохранение обрабатывается с помощью tools/ImageSave.javaэтого комментария, объясняющего поведение (которое я отформатировал): -

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

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

Нам необходимо рассмотреть несколько ситуаций:

  1. Пользователь редактирует локальное изображение local01.jpg. A local02.jpgбудет создан в том же каталоге, а исходное изображение будет перемещено во вспомогательный каталог как ./.aux/local02.jpg. Если пользователь отредактирует файл local02.jpg, local03.jpgбудет создан в локальном каталоге и ./.aux/local02.jpgбудет переименован в./.aux/local03.jpg

  2. Пользователь редактирует удаленное изображение remote01.jpgс picassa или другого сервера. remoteSavedLocal01.jpgбудут сохранены в соответствующем локальном каталоге. В remoteSavedLocal01.jpg, будет ссылка, указывающая на remote01.jpg. Не будет локальной копии remote01.jpg. Если пользователь редактирует remoteSavedLocal01.jpg, то remoteSavedLocal02.jpgбудет сгенерирован новый и все еще указывающий наremote01.jpg

  3. Пользователь удаляет любое локальное изображение local.jpg. Поскольку имена файлов во вспомогательном каталоге сохраняются, каждый раз при local.jpgудалении файлы во вспомогательном каталоге, имена которых начинаются с " local.", будут удаляться. Этот шаблон облегчит удаление нескольких изображений во вспомогательном каталоге.

Вкратце: да , он сохраняет отредактированные изображения в .auxкаталоге, внутри каталога, из которого было получено изображение.

Он также хранит цепочку фильтров, которую вы использовали для создания изображения в метаданных XMP , внутри нового изображения (отфильтрованного) в пространстве имен http://ns.google.com/photos/1.0/filter/. Эта информация состоит из:

  • SourceFileUri: URI, где он сохранил неизмененный файл
  • filterstack: сериализованное представление стека используемых фильтров (в том же формате он сохраняет пресеты в своей частной базе данных)
Отличный ответ! С кодовой ссылкой и всем остальным. Я люблю это. Большое спасибо, Дэн.