Сегодня я заметил, что если вы применяете фильтры или изменяете изображение с помощью приложения галереи, оно применяет изменения к изображению, а не создает новое изображение с изменениями. Моей первой мыслью было, что это не очень хорошая идея. Иногда вы хотите сохранить исходное, нетронутое изображение, а также измененное изображение, возможно, для целей сравнения или для того, чтобы попробовать другие фильтры или настройки. В моем случае я играл с кривыми, а затем сохранил изображение. Я хотел сравнить новое изображение с оригиналом, но оригинала не было. Я решил вернуться к настройкам кривых и увидел, что кривые остались такими же, как я их установил, а это значит, что я могу просто восстановить кривую для каждого канала, и это вернет мне исходное изображение.
Я решил провести тест с другим изображением. Я открыл новое изображение, применил фильтр из предустановленных фильтров и сохранил изображение. Затем я вернулся к изображению и снова отредактировал его, но на этот раз я удалил фильтр, и изображение стало нормальным.
Моей первой мыслью было, что к изображению в галерее применены неразрушающие правки. Что-то похожее на то, что делают некоторые программы для редактирования. На ум приходит Shotwell, хотя это скорее просмотрщик, чем редактор, но у него есть некоторые ограниченные функциональные возможности для игры с насыщенностью, уровнями и другими настройками. Маловероятно, что приложение галереи на андроиде делало это, потому что другие приложения для просмотра изображений показывали изображение с примененным к нему фильтром.
Я решил подключить устройство к компьютеру с помощью USB-кабеля. Я перешел к папке камеры и открыл изображение на компьютере, и оно показало измененное изображение. Это означает, что изображение изменяется. Пока устройства были еще подключены к компьютеру, я решил убрать фильтр и снова открыть изображение на компьютере. Изображение вернулось к исходному.
Как Android может напрямую изменять файл изображения, а затем восстанавливать его до исходного состояния. Сохраняет ли исходный файл где-то еще?
Как воспроизвести:
- Откройте приложение Галерея (по умолчанию)
- Выберите изображение для редактирования и коснитесь маленького карандаша в левом нижнем углу экрана.
- Отредактируйте изображение, коснитесь кнопки «Сохранить» или просто нажмите кнопку «Назад». Он спросит, хотите ли вы сохранить изображение. Сохрани это.
- Коснитесь карандаша еще раз, удалите фильтр.
- Ваше изображение возвращается к исходному.
Устройство: Нексус 7
ОС: Андроид 4.4.2
Вы можете найти исходный код этого приложения в пакете Gallery2 в AOSP . Весь код фоторедактора находится в формате src/com/android/gallery3d/filtershow
. Сохранение обрабатывается с помощью tools/ImageSave.java
этого комментария, объясняющего поведение (которое я отформатировал): -
Чтобы поддерживать новое поведение редактирования-сохранения, при котором пользователь не будет видеть отредактированное изображение вместе с исходным изображением, мы добавляем новый вспомогательный каталог для отредактированного изображения. По сути, исходное изображение будет скрыто в этом каталоге после редактирования, и пользователь увидит только отредактированное изображение.
Обратите внимание, что удаление отредактированного изображения также приведет к удалению исходного изображения во вспомогательном каталоге.
Нам необходимо рассмотреть несколько ситуаций:
Пользователь редактирует локальное изображение
local01.jpg
. Alocal02.jpg
будет создан в том же каталоге, а исходное изображение будет перемещено во вспомогательный каталог как./.aux/local02.jpg
. Если пользователь отредактирует файлlocal02.jpg
,local03.jpg
будет создан в локальном каталоге и./.aux/local02.jpg
будет переименован в./.aux/local03.jpg
Пользователь редактирует удаленное изображение
remote01.jpg
с picassa или другого сервера.remoteSavedLocal01.jpg
будут сохранены в соответствующем локальном каталоге. ВremoteSavedLocal01.jpg
, будет ссылка, указывающая наremote01.jpg
. Не будет локальной копииremote01.jpg
. Если пользователь редактируетremoteSavedLocal01.jpg
, тоremoteSavedLocal02.jpg
будет сгенерирован новый и все еще указывающий наremote01.jpg
Пользователь удаляет любое локальное изображение
local.jpg
. Поскольку имена файлов во вспомогательном каталоге сохраняются, каждый раз приlocal.jpg
удалении файлы во вспомогательном каталоге, имена которых начинаются с "local.
", будут удаляться. Этот шаблон облегчит удаление нескольких изображений во вспомогательном каталоге.
Вкратце: да , он сохраняет отредактированные изображения в .aux
каталоге, внутри каталога, из которого было получено изображение.
Он также хранит цепочку фильтров, которую вы использовали для создания изображения в метаданных XMP , внутри нового изображения (отфильтрованного) в пространстве имен http://ns.google.com/photos/1.0/filter/
. Эта информация состоит из:
SourceFileUri
: URI, где он сохранил неизмененный файлfilterstack
: сериализованное представление стека используемых фильтров (в том же формате он сохраняет пресеты в своей частной базе данных)
Матье Арле
Бузу