Показаны сообщения с ярлыком wand. Показать все сообщения
Показаны сообщения с ярлыком wand. Показать все сообщения

суббота, 3 апреля 2010 г.

SXEmacs живёт

После некоторого затишья проект SXEmacs продолжил развитие. Появились merge-requestы и что-то всё таки делается. Залили мои патчи к FFI, которые реализуют новый тип safe-string в помощь дядьке, который пишет FFI к libdbus. Так же в Wand-mode я добавил поддержку модного liquid scale, кто не знает, то это выглядит вот так

Кстати, я наконец-то придумал как можно использовать wand-button в стандартном customize!

среда, 16 декабря 2009 г.

Генератор кнопок

В (S)XEmacs есть классный package, называется xpm-button.el. Он умеет на лету генерировать картинку с кнопкой. Всё вроде бы хорошо, но «красота» сгенерированных кнопок повергает в уныние. Решил написать достаточно гибкий генератор красивых кнопок используя Wand-mode. По мере написания генератора, добавлял необходимый функционал в Wand-mode. Вот что в итоге получилось:

(wand-button 150 32 "Wand Button"
             :bg "cornflowerblue" :fg "white"
             :round 8.0 :depth 1 :yoff 8 ; :type 'pressed
             :wand-font (make-wand-font :family "Zapfino"))

button1

(wand-button 100 20 "Wand Button"
             :bg "gray80" :fg "black" :round 10.0
             :contrast 0.5 :depth 2 ; :type 'pressed
             :wand-font (make-wand-font :family "Copperplate"))

button2

(wand-button 100 40 (encode-coding-string "привет" 'utf-8)
             :bg "palegreen" :fg "green" :round 0.0
             :depth 4 :yoff -2 ; :type 'pressed
             :wand-font (make-wand-font :family "Arial Black"
                                        :size 20))

button2

Интересно будет этот функционал внедрить в Emacs widgets, а то кнопки там сделаны через очень большую задницу.

ReST source Скачать оригинал

пятница, 27 ноября 2009 г.

Wand-mode - новые возможности

Wand-mode развивается, с тех пор как я сделал описание, было добавлено несколько интересных возможностей. Их я и опишу.

Имя файла в имени буфера

Откроем какую-нибудь картинку: C-x C-f lg-tree.jpg RET, получаем примерно следующее:

orig image

Замечаем, что в mode-line отображается имя буфера, которое теперь содержит имя оригинального файла. Удобно при переключении с помощью C-x C-b.

Новая операция: modulate

Фотка сама по себе классная, но природа выглядит как-то уныло, немного приукрасим, с помощью команды o modulate RET saturation RET 60 RET, получим результат:

sat inc 60 percents

60% increased saturation

Уже намного лучше.

Поддержка IPTC профиля

Хочется добавить информацию о том, что это там на фотке. Воспользуемся редактором IPTC профиля. Добавим IPTC теги с помощью p caption RET lg climbes trees RET и p keywords RET js-kit, corporative RET, получим:

caption and keywords added

Caption and Keywords added

Pixel color picker

Интересно какого цвета у меня трусы, кликнем на них и увидим:

pixel color picker

Pixel color picker

Видим координаты пикселя, по которому мы кликнули, его цвет и разложение по RGB. Удобно.

Глобальные операции

Иногда нужно просмотреть несколько картинок применяя конкретный набор операций, например увеличение. Для этого теперь есть команда фиксирования операций, по умолчанию висит на O, нажмём её и перейдём к следующей картинке в директории с помощью SPC:

global operations

Global operations applied

Видим список глобальных операций, а также замечаем, что они были автоматически применены к картинке. Однако для этой картинки увеличение saturation не подходит. Отменим с помощью undo (C-/):

operations canceled

Operations canceled

Чтобы сбросить глобальные операции нужно нажать C-u O.

Редактор свойств изображения

Иногда нужно подправить EXIF данные у изображения. Лично я не пользуюсь этой возможностью (мне хватает IPTC профиля), но есть один знакомый фотограф, который попросил эту функциональность в Wand-mode. Мне не сложно за пару пива. Вызвать редактор можно с помощью кнопки e. Он отфильтрует свойства согласно переменной Wand-mode-properties-pattern ("^exif:" по умолчанию).

Новая операция: grayscale

Существует множество методик преобразования картинки в чёрно-белую. Один из них, например, полностью удалить saturation с помощью o modulate RET saturation RET -100 RET, что часто приводит к желаемому результату. Всё же была добавлена возможность поменять colormap на grayscale — o grayscale RET

Новая операция: fit to size

Иногда нужно изменить размеры изображения, чтобы она влазила в определённый размер. Теперь это можно сделать с помощью o fit to size RET. Эта операция запросит ширину, высоту и сохраняя соотношение сторон изменит размер. Есть также пользовательская переменная Wand-mode-scaler, которая отвечает за то, какой преобразователь будет использован. Вы можете создавать свои собственные преобразователи с помощью Wand-make-scaler; неплохой настройкой может быть:

(setq Wand-mode-scaler (Wand-make-scaler :GaussianFilter 1))

Документация к Wand-mode-scaler и Wand-make-scaler содержит исчерпывающую информацию о преобразователях.

ReST source Скачать оригинал

пятница, 19 декабря 2008 г.

Просмотр страничных файлов в Wand-mode

Недавно в Wand-mode была добавлена возможность просмотра страничных файлов, таких как PDF, EPS, MPEG и т.д., у которых есть несколько страниц. Навигация по страницам до ужаса проста:

  • PgDown - Следующая страница
  • PgUp - Предыдущая страница
  • Home - Первая страница
  • End - Последняя страница
  • g или M-g - Переход на выбранную страницу. Передать номер страницы можно посредством универсального аргумента или ввести интерактивно.

Конечно, Wand-mode это вам не xpdf или gv, но для быстренького ознакомления с документом или быстренького выковыривания нужной картинки из книжки или видео вполне сгодится.

Текущая страница и общее количество страниц будет отображено на экране если у вас non-nil Wand-mode-show-fileinfo.

Заметим, что операции над картинкой будут осуществляться только для текущей страницы, а не для всех страниц файла.

ReST source Скачать оригинал

Wand-mode - алгоритм устранения красных глаз

Внимание!

Для корректного отображения этой страницы вашему браузеру необходима поддержка формата MathML.

Как и обещал напишу про то, как улучшить алгоритм устранения красных глаз у Wand-mode и как его тестировать. Возможно, что найдутся желающие его поковырять и улучшить ибо я не эстет да ещё и дальтоник к тому же, так что доволен тем, что есть и сейчас.

Описание алгоритма

Вкратце, проходим по всем пикселям выделенной области и смотрим на их красноту. Если пиксел достаточно красный, то заменяем его на тёмный. Затем немного размываем пикселы лежащие внутри эллипса, вписанного в выделенную область. Определение красности пиксела и его замена на более тёмный происходит в функции Wand-fix-red-pixels. Аргумент PIXELS, который она принимает — это список троек, где каждая тройка имеет вид (RED GREEN BLUE). RED, GREEN и BLUE принимают значения от 0 до 255.

После того как пикселы подправлены краснота уйдёт, но кое-где могут остаться резкие перепады цвета. Для того чтобы их сгладить мы накладываем эллиптическую маску (ибо зрак, в основном, круглой формы ;)) и применяем размытие по Гауссу с радиусом, который нам выдаст функция Wand-mode-redeye-blur-radius.

С чего начать

Неплохим началом в ковырянии алгоритма может стать функция Wand-mode-redeye-blur-radius. Это должна быть такая хитрая функция, которая даёт небольшие значения для маленьких входных и очень медленно растёт. Сейчас это убогая WH16 , где W — ширина выделенной области, а H — высота.

Тестирование улучшенного алгоритма

Для начала скачайте вот эту картинку с примерами красных глаз. Затем для тестирования вам понадобится следующая команда:

(defun Wand-test-redeye (arg)
  "Apply redeye reduction algorithm to ARG's region."
  (interactive "p")
  (let ((pp '(((41 41 349 302) (39 34 86 307)
               (44 42 354 58) (47 42 94 151))      ; first region
              ((29 31 315 676) (36 33 108 660)
               (86 79 168 468))                    ; second region
              ((28 26 335 885) (26 25 147 930)
               (21 18 267 774) (21 18 129 792))    ; third region
              ((26 26 343 1219) (28 29 87 1161)
               (25 18 294 1044) (23 18 127 1036))  ; fourth region
              ((17 15 431 1468) (18 17 376 1463)
               (17 20 310 1468) (17 20 232 1477)
               (13 15 116 1458) (13 15 25 1466)
               (23 25 253 1336) (21 25 132 1378))  ; fifth region
              )))
    (mapc (lambda (reg)
            (Wand-operation-apply 'redeye-remove image-wand reg))
          (nth (1- arg) pp))
    (Wand-redisplay))) 

Откройте картинку redeye-samples.jpg с помощью M-x Wand-display RET. Тестировать алгоритм устранения красных глаз можно с помощью команды C-u <NUM> M-x Wand-test-redeye RET, где <NUM> это номер области над которой нужно произвести тестирование. Как видно из кода всего есть 5 областей. После выполнения команды проверьте результаты с помощью программы для увеличения, я предпочитаю Lupe — быстро работает и вообще отличный софт. Если для всех областей результаты схожи с тем что справа, то у вас неплохо получилось.

Присылайте результаты в список рассылки sxemacs-devel@, для лучшего варианта предусмотрен приз ;)

ReST source Скачать оригинал

вторник, 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