вторник, 2 декабря 2008 г.

Wand-mode -- забудьте о display(1)

Wand-mode это режим просмотра и редактирования изображений для SXEmacs. Wand-mode базируется на API ImageMagick и поэтому в Wand-mode возможны многие операции программ convert(1), display(1) и т.д. Wand-mode поддерживает все форматы поддерживаемые IM, а их более 100, в том числе PDF, EPS, etc.

Знакомство с Wand-mode

M-x Wand-display RET /path/to/image.jpg RET получаем результат примерно следующий:
Wand-display sample
Смотрим информацию о файле - кнопка i:
Wand-display identify
Теперь подредактируем: наложим операцию очищения от мусора (Despeckle) и немного уменьшим контрастность. Используем кнопки o despeckle RET далее o contrast RET decrease RET. Везде будет работать completition так что не переживайте. Получаем результат:
Wand-display edit

Просмотр директорий с изображениями

У Wand-mode простые, но неплохие навигационные возможности для просмотра. Откройте любой файл с помощью Wand-display, если в его директории есть ещё файлы, поддерживаемые IM, то вы можете использовать кнопки:
  • Space - следующая картинка
  • BackSpace - предыдущая
  • M-< - Самая первая картинка в директории
  • M-> - Самая последняя картинка в директории

Меню Wand-mode

У Wand-mode есть отличное меню (чем-то схожее с меню display(1)) для работы изображением.

Wand-display menu
Меню доступно либо из menubar если он у вас включён, либо же по правой кнопке мыши. Все команды, которые можно выполнить клавиатурой можно выполнить и через меню. Верно и обратное - все команды, которые можно выполнить через меню можно выполнить и через клавиатуру.

Настройка Wand-mode

У Wand-mode не так много параметров, поэтому настройка дело простое. Как обычно вы можете всё сделать через M-x customize-group RET Wand-mode RET, я лишь приведу небольшое описание параметров, которые вы скорее всего захотите изменить:
  • Wand-mode-zoom-factor - Number (default: 2)

    Как из названия ясно это коэффициент для команд +(zoom-in) и - (zoom-out)

  • Wand-mode-show-fileinfo - Boolean (default: t)

    Если non-nil, то будет выводится минимальная информация о просматриваемом файле. Для более подробной информации, как уже отмечалось, есть команда i.

  • Wand-mode-show-operations - Boolean (default: t)

    Если non-nil, то при выполнении операций будет выводится список операций над изображением. Выполнять команды undo/redo вы сможете в любом случае.

  • Wand-mode-auto-fit - Boolean (default: t)

    Если non-nil, то при выводе изображения в окне SXEmacs оно(изображение) будет уменьшено если не умещается.

  • Wand-mode-auto-rotate - Boolean (default: t)

    Если non-nil, то в случае наличия у изображения информации о его ориентации (современные фотоаппараты умеют правильно определять ориентацию в зависимости от положения фотоаппарата в пространстве), то выводимое изображение будет автоматически повёрнуто. При этом поворот будет входить в список совершённых операций над изображением. Достаточно удобно.

Внесение изменений и сохранение результатов

Для операций над изображением по умолчанию доступны следующие кнопки:
  • l - Поворот на 90° против часовой стрелки (как бы влево)
  • r - Поворот на 90° по часовой стрелке (как бы вправо)
  • + - Увеличение изображения в соответствии с Wand-mode-zoom-factor
  • - - Уменьшение изображения в соответствии с Wand-mode-zoom-factor
  • o - Главная кнопка операций. Спрашивает у пользователя какую операцию и с какими параметрами применить. Поддерживает completition.
Операции можно применять одна за другой, как мы уже делали. Все операции над картинкой записываются и в любой момент можно сделать undo или redo операций с помощью стандартных клавиш C-/ (или C-_) и C-x C-/, также можно повторно применить последнюю операцию при помощи кнопки C-. или C-x M-: (в обычном режиме эта комбинация выполняет команду `repeat-complex-command'). Чтобы отменить все операции просто перезагрузите изображение при помощи команды C-r.

Теперь когда новое изображение готово, его нужно сохранить на диск. Для этого есть две команды:

  • C-x C-w - Вам предложат выбрать один из форматов для записи и имя нового файла. ВНИМАНИЕ: запись в неграфические форматы типа HTML, TXT и т.д. может привести к core dump. По всей видимости это связано с ошибкой в IM, но, к сожалению, разработчики IM не шибко контактные ребята, поэтому бог знает когда это будет исправлено.
  • C-x C-s - Простой вариант записи. Вам предложат выбрать имя файла, а формат изображения будет определён из расширения имени.

Операции над областью изображения

С помощью левой кнопки мыши можно выделить некоторую область изображения, например руку Сары:
Wand-display region
Если параметр Wand-mode-show-fileinfo проставлен в non-nil, то вы увидите координаты области, иногда это полезно. Когда область активна, то некоторые операции (которые можно применить для области, например изменение контраста, уменьшение шума, размытие и т.д.) будут изменять изображение только в области. Есть также команды, которые можно выполнить только для области, такие как:
  • c - crop, оставить только область и отрезать всё что вне её
  • o chop RET - chop, вырезать область и сомкнуть края
  • Устранение красных глаз
Выполнив операцию над областью, выделение исчезает. Чтобы заново выделить последнюю область используйте команду C-M-z (в обычном режиме эта комбинация клавиш выполняет activate-region).

Устранение красных глаз

Самое главное в устранении красных глаз это грамотно выделить область с краснотою. Выделять лучше всего таким образом, чтобы краснота была в центре и оставалось немного пространства от красноты до краёв выделенной области. Вот пример удачного выделения:
Wand-display red eye good region
А вот не совсем удачного, хотя алгоритм устранения красных глаз сработает и в данном случае, но при более тяжёлых будут заметны артефакты:
Wand-display red eye bad region
После того как вы выделили нужную область просто нажмите . или выберите пункт в Меню Wand →Region→Remove red eye. Алгоритм устранения красных глаз достаточно прямолинеен и не дотягивает до реализованных в профессиональных утилитах. С другой стороны результаты демонстрирует неплохие и пригодные для сельской местности. Я провёл сравнение и вот результаты:
Wand-display red eyes sxemacs vs prof
Про то как улучшить алгоритм устранения красных глаз и как его тестировать я напишу в следующий раз.

Сводная таблица операций

Ну и напоследок я сделал небольшой обзор операций над изображениями. Заметим, что операции, которые не изменяют размер изображения могут без проблем применяться к области:
Transform
Sample Width: 400 Height: 200
Rotate Degrees: 120°
Flip
Flop
Effect
Add Noise Noise type: Poisson
Despeckle
Edge detect Radius: 1.0
Emboss Radius: 1.0 Sigma: 2.0
Gaussian Blur Radius: 1.0 Sigma: 2.0
Radial Blur Radius: 3.0
Reduce Noise
Sharpen Radius: 1.0 Sigma: 2.0
Spread Radius: 1.0
Enhance
Contrast Type: increase
Contrast Type: decrease
Enhance
Equalize
Negate
Normalize
F/X
Charcoal Radius: 1.0 Sigma: 2.0
Implode Radius: 0.4
Implode Radius: -0.4
Oil Paint Radius: 2.0
Sepia Tone Threshold: 85%
Solarize Threshold: 50%
Swirl Angle: 90°
Vignette Black/White: 10
Wave Amplitude: 2 Wave length: 10

5 комментариев:

lg комментирует...

нда, что-то таблица совсем уехала и как с этим бороться хз

Alex Ott комментирует...

а без SXEmacs не живет?

lg комментирует...

в XEmacs должно работать если собрать ветку с бэкпортом FFI от Стива в XEmacs.

В GNU Emacs возможно если только RMS изменит точку зрения на FFI. Принципиальных проблем в портировании FFI из SXEmacs в GNU Emacs не должно возникнуть.

Alex Ott комментирует...

а если переделать на вызов утилит?

lg комментирует...

бог его знает, может и получится. Даже если и получилось бы, то это было ужасно медленно, особенно для больших картинок

при ffi один раз подгрузили в память (процесса SXEmacs) и уже работаем с этой инстанцией

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