Цель PhotoSlider'а
Я читаю несколько фото-блогов, в которых иногда проскакивают «фото паки/сессии/репортажи». Плюс знакомые несут свои фото гигабайтами. Как только фотографий набирается довольно много (тысяч по 10-20) я их просматриваю оставляя себе на wallpaper'ы избранный 0,001% из них.
Фотоаппараты у всех всё лучше, фотографии весят всё больше, что не может сказаться на скорости их загрузки. Встала проблема с тем, как это всё эффективно разгребать. Почти все фотографии после разового просмотра удаляются, небольшое количество избранных перемещаются в папочку для wallpaper'ов.
Изначально пользовался либо Picasa, либо FSViewer. Но оба по некоторым причинам не устраивали.
- Picasa не хочет показывать фото на весь экран, нельзя удалять нажатием одной кнопки (для каждой фотографии спрашивает подтверждение), переключение на следующую фото довольно медленное (в случае просмотра ~24 MP фото на ноуте весьма неприятно);
- FSViewer тоже особой скоростью не отличался, с удалением получше, но всё равно медленно. К тому же он до сих пор не понимает unicode в именах файлов (давно уже просил разработчиков добавить поддержку).
Помучавшись немного начал писать свою утилиту, которая и стала PhotoSlider'ом.
Под катом подробности реализации и управления.
Как пользоваться
Инсталляшки нет, запускается из консоли. Понимает всего 2 параметра:
- as — запускать на всех мониторах
- --movepath [path] — куда избранные перемещать (по умолчанию создаётся папочка _good).
Рекурсивно сканирует текущую папку (с подпапками), всегда разворачивается на весь экран. Если есть возможность вывести несколько фото на экран (допустим, если 2 панорамы влазят по вертикали на экран не мешая друг другу), будут показаны несколько.
Управление следующее (не настраивается за ненадобностью, по крайней мере мне).
- escape — выход;
- space — показать следующую порцию фото, ничего с текущими не делая;
- del — удалить все. Осторожно, удаляются без всяких запросов и мимо корзины!
- m — переместить все фото «в избранное»;
- стрелки up/down — «добавить/удалить ряд». Т.е. максимальное разрешение фото по вертикали делится на количество рядов. Удобно просматривать пачками когда неинтересных фото очень много;
- стрелки left/right — то же самое, только с рядами;
- По клику мышкой можно посмотреть «полноэкранное» фото, если количество рядов/столбцов > 0, отдельно от остальных фото. По правой кнопке есть менюшка, дублирующая кнопки
Как технически реализовано
Фотографии подгружаются в отдельном потоке. Что бы не терять время на масштабирование при выводе на экран все фото масштабируются (с сохранением пропорций) под разрешение экрана в этом же (выделенном) потоке.
Отдельный поток занимается комбинацией фотографий для следующего экрана. При поступлении команды сначала показываются новые фото из скомбинированного экрана (что бы пользователь увидел их с как можно меньшей задержкой) и только потом старые фото релизятся/удаляются/перемещаются.
Что бы не забить всю память есть ограничение на количество висящих очереди фото (сейчас это это абстрактное ограничение: сумма всех фото (ширина * высота * 4) < 1024 * 1024 * 1024. Всё хочу переделать на ограничение в зависимости от доступной ОЗУ, но пока есть более интересные дела).
По ощущениям работает значительно живее остальных вьюеров (для описанных выше целей), но ожидал получить скорость побольше. Похоже где-то есть узкое место, но пока не профайлил ввиду отсутствия профайлера.
Из замеченных, но не отловленных дефектов:
- некоторые фото отказываются грузиться, хотя тот же FSViewer их открывает без проблем. Проблема где-то внутри виндовых функций, которыми пользуется .NET Framework, похоже;
- иногда невозможно удалить определённые файлы. Не смог нагуглить, почему не удаляются;
- иногда получается неправильное масштабирование, если часто играться с изменением количества рядов/столбцов;
Несколько последних коммитов не проверял весь функционал, возможно где-то ещё что-нибудь вылезет.
Всё это написано на C# под .NET 3.5. Писалось часто кусочками и в спешке, архитектура приложения весьма запутана. Надеюсь, как-нибудь соберусь и доведу код до нормальной читаемости. Комментариев по большей части нет, по этой же причине (+ изначально не планировал её развивать дальше «приложения на раз-два попользоваться»). Тестировалось только под Windows. Под Mono ничего не писал пока, скомпилируется или нет — не знаю. Хотя меня всё больше тянет перейти на ubuntu, может в будущем переделаю под mono.
Исходники выложены на Google Code под GPL3.
Надеюсь данная утилита пригодиться ещё кому-нибудь кроме меня.
Автор: sibvic