Готовим скриншоты для документации в GIMP (часть 1)

    Как известно, неотъемлемой частью профессионального программного продукта является качественная документация. А документация, в свою очередь, немыслима без иллюстраций. В большинстве случаев иллюстрации представляют собой скриншоты, которые должны быть не только красивыми и информативными, но и единообразно оформленными. Последнее важно, если над разными разделами документации работают разные специалисты (технические писатели). В этой статье мы рассмотрим, как редактор растровой графики GIMP и его встроенный язык сценариев Script-Fu могут пригодиться для подготовки иллюстраций. В качестве примеров использованы скриншоты нашего продукта eXpressApp Framework.

    Язык сценариев Script-Fu основан на Scheme (диалекте Lisp), и доступен в GIMP «из коробки» на любой платформе, поэтому мы выбрали именно его. В качестве первого простейшего примера рассмотрим скрипт, который применяет эффект тени с предустановленными параметрами. Почему не воспользоваться стандартным Drop Shadow? Да потому что он задает много лишних вопросов о параметрах тени. А мы хотим, чтобы тень была всегда одинаковая (черного цвета, с определёнными смещением, радиусом размытия и прозрачностью), и чтобы не приходилось заново задавать эти параметры. Итак, открываем любимый текстовый редактор и пишем скрипт:

    (define (script-fu-quick-shadow image drawable)
    	(gimp-context-push)
    	(gimp-image-set-active-layer image drawable)
    	(gimp-image-undo-group-start image)
    
    	; Вызов стандартной процедуры script-fu-drop-shadow
    	(script-fu-drop-shadow image drawable 3 4 10 '(0 0 0) 40 TRUE)   
    
    	(gimp-image-undo-group-end image)
    	(gimp-displays-flush)
    	(gimp-context-pop)
    )
    
    (script-fu-register "script-fu-quick-shadow"
    	"Быстрая тень"
    	"Отбросить тень со стандартными параметрами:
    	 смещение по X = 3, по Y = 4, радиус размытия = 10,
    	 цвет черный, прозрачность 40%."
    	"Василий Пупкин <pupkin@example.com>"
    	"ООО Рога и Копыта"
    	"2010/10/6"
    	"RGB*"
    	SF-IMAGE      "Image"      0
    	SF-DRAWABLE   "Drawable"   0
    )
    
    (script-fu-menu-register "script-fu-quick-shadow"
                             "<Image>/Filters/Мои скрипты"
    )
    

    Типичный скрипт состоит из определения основной процедуры, которая делает всю работу (script-fu-quick-shadow), и вызовов встроенных процедур script-fu-register и script-fu-menu-register, которые регистрируют скрипт, определяют какие параметры он будет запрашивать у пользователя и создают соответствующий пункт в меню. Cкрипт «Быстрая тень» требует только наличия открытого RGB изображения, и запрашивать ничего не должен. В своей основной процедуре он обращается к встроенной процедуре script-fu-drop-shadow. Если хотите разобраться, что за параметры переданы этой процедуре, найдите её описание в «просмотре процедур Script-Fu» (Фильтры -> Script-Fu -> Консоль -> Просмотреть...). Вызовы процедур до и после вызова script-fu-drop-shadow типичны для большинства скриптов и требуютcя для передачи текущего контекста плагину, корректного взаимодействия с буфером Undo/Redo и обновления UI после отработки скрипта. Кстати, большинство встроенных фильтров GIMP реализованы на Script-Fu, и под Windows их исходники доступны в папке %ProgramFiles%\GIMP-2.0\share\gimp\2.0\scripts, а под Linux – в /usr/local/share/gimp/2.0/scripts. Вы можете использовать их как отправную точку при разработке собственных скриптов.

    Сохраним наш первый скрипт с расширением scm, и поместим его в папку пользовательских скриптов. В Windows, пользовательские скрипты лежат в папке %USERPROFILE%\.gimp-2.6\scripts, в Linux – в папке ~/.gimp-2.6/scripts. Теперь надо перезапустить GIMP, или выполнить команду Фильтры -> Script-Fu -> Обновить Сценарии. Если в коде нет ошибок, наш скрипт будет виден в «просмотре процедур Script-Fu»:



    Обратите внимание, здесь видны сведения об авторе, которые мы передали в script-fu-register. Можете воспользоваться этой возможностью, чтобы пользователи знали кому говорить спасибо, или передать пустые строки и сохранить инкогнито.

    Выполнить скрипт можно через меню “Фильтры -> Мои скрипты”:



    Для удобства вызова можно назначить подходящую клавиатурную команду. Стоит отметить, что GIMP поддерживает динамические шоткаты – достаточно нажать желаемый «аккорд» когда указатель находится над требуемым пунктом меню, и настройка будет сохранена. По умолчанию эта полезная функция отключена, ее можно включить в настройках в разделе «Интерфейс».

    Скрипт «Быстрая тень» предполагает, что он вызывается для скриншота окна, обрезанного по рамке. Такое изображение можно получить, нажав Alt+PrtScr, или используя специализированный софт для захвата скриншотов, например SnagIt. Ниже приведен скриншот окна, обработанный «быстрой тенью»:



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

    (define (script-fu-cut-corners 	image 
    				drawable
    				radius
    				only-top)
    	(gimp-context-push)
    	(gimp-image-set-active-layer image drawable)
    	(gimp-image-undo-group-start image)
    
    	; Добавляем альфа-канал (прозрачность)
    	(gimp-layer-add-alpha drawable)
    	; Выделяем все изображение, cкругляем уголки выделения
    	(gimp-round-rect-select image 0 0 (car (gimp-image-width image))
    		        (car (gimp-image-height image)) 
    			radius radius CHANNEL-OP-REPLACE TRUE FALSE 0 0)
    	; Инвертируем выделение
    	(gimp-selection-invert image)
    	; Если требуется подрезать только верхние уголки...
    	(if (= only-top TRUE)
    		; ...то вычитаем из выделения область изображения
    		; охватывающую оба нижних уголка
    		(gimp-rect-select image 
    				0
    				(- (car (gimp-image-height image)) radius) 
    				(car (gimp-image-width image)) 
    				radius 
    				CHANNEL-OP-SUBTRACT 
    				FALSE 
    				0))
    	; Удаляем выделенные области
    	(gimp-edit-clear drawable)
    	; Снимаем выделение
    	(gimp-selection-none image)
    	
    	(gimp-image-undo-group-end image)
    	(gimp-displays-flush)
    	(gimp-context-pop)
    )
    
    (script-fu-register "script-fu-cut-corners"
    	"Подрезать уголки"
    	"Подрезать скругленные уголки скриншота окна."
    	"Василий Пупкин <pupkin@example.com>"
    	"ООО Рога и Копыта"
    	"2010/10/6"
    	"RGB*"
    	SF-IMAGE      	"Image"                   	0
    	SF-DRAWABLE   	"Drawable"                	0
    	SF-ADJUSTMENT 	"Радиус (0 - 20 пикселей)"	'(8 0 20 1 10 0 0)
    	SF-TOGGLE	  	"Только верхние"		FALSE
    	
    )
    
    (script-fu-menu-register "script-fu-cut-corners"
                             "<Image>/Filters/Мои скрипты")
    


    Этот скрипт запрашивает параметры у пользователя. Во-первых, нужно указать радиус скругления уголков. Для дефолтной темы Windows 7 подходит значение 8 точек, в Vista радиус поменьше. Во-вторых, для некоторых тем может пригодиться опция – подрезать только верхние уголки.



    Ниже приведён результат последовательного запуска скриптов “Подрезать уголки” и “Быстрая тень”:



    Уже выглядит лучше, можно вставлять в документацию или на сайт.

    В нашей следующей статье по GIMP мы рассмотрим, как красиво оформить скриншот фрагмента окна. Например, вот так:



    Продолжение — здесь.
    Developer Soft
    Company
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 40

      +6
      Гуд, топик порадовал. И выглядит результат хорошо.
        +7
        Красота! Спасибо за ценный материал.
          +5
          Если уж писать скрипты, то тогда можно и ImageMagick взять.
          И GIMP не нужен, и писать можно на чем угодно, включая bash.

          Еще лучше брать GraphicsMagick, как более продвинутый форк.
            +5
            ImageMagick хорош для пакетной обработки. А нам в большинстве случаев нужно работать с каждым изображением вручную — кадрировать, добавлять сноски и подписи, собирать в коллажи. Т.е. GIMP все равно нужен. А скрипты упрощают те операции, которые руками долго делать.
            +4
            Каким образом вам удалось получить вот такой скриншот? Белая обоина?:)
            Статья порадовала, на заметку схвачено, спасибо.
              +1
              Три варианта с ходу:
              1. Белые обои;
              2. На заднем плане программа с белым фоном окна (при написании документации хорошо подходит Word :));
              3. Просто выделить и отрезать все лишнее :)
                0
                > при написании документации хорошо подходит Word

                Тогда уж OpenOffice.org Writer, раз уж дело происходит в Ubuntu.
                  +2
                  Хорошо, напишем «подходит используемый вами текстовый редактор» :)
              +6
              Почти угадали. Пустой файл в gedit :-) Остается откадрировать начерно, и добить автокропом. Минус в том что фон остается белым, без альфа-канала, и изображение не получится поставить на веб-страницу с произвольным фоном. Обычно в таких случаях делаем захват через SnagIt с опцией Multiple Area, дальнейшая обработка в GIMP.
                0
                Я в таких случаях ставлю белый фон вместо обоев. Делаю скриншот, вырезаю нужное окно захватывая фон. Потом создаю новое изображение с прозрачным фоном, вставляю снимок и удаляю белый фон, добавляю тень. Получается нечто такое. Правда есть единственный минус — все действия занимают около минуты, никакой автоматизации.
                +3
                Именно такое подрезание фрагмента окна сейчас бы очень пригодилось по работе!
                С нетерпением жду продолжения
                  +1
                  Shutter под Linux же есть.
                    +2
                    За Shutter спасибо. Судя по скриншотам это мощная штучка, пощупаю на досуге.
                    +2
                    Автоматизация очистки углов окон — это в самом деле круто! :)

                    На счет добавления теней я бы не согласился — при печати будет выглядеть грязно. Особенно если печать офсетная или на офисном лазернике.
                      +3
                      Мы документацию поставляем только в электронном виде. PDF-версии могут содержать тысячи и десятки тысяч страниц — врятли кто-то захочет их распечатывать. Если только фрагменты для временного использования. Ну а для офсетной полиграфии материалы готовить — тут Гимп пока не поможет — поддержки CMYK нет.
                        +1
                        А самом деле тысячи страниц? Ничего так у вас документация! :)

                        Если кто-то захочет распечатать две страницы, то это уже повод подумать о выводе на печать.

                        Что касается CMYK — он актуален при подготовке оригинал-макета документа, печатаемого в цвете. Тогда перевод в CMYK выполнят при верстке или уже в типографии. До этого момента картинки даже проще хранить в RGB или Grayscale (если заранее известно, что документ будет отпечатан в черно-белом варианте). Так что можно готовить в GIMP :)
                          0
                          Если всерьез озаботиться красотой распечатки, нужно еще массу ньюансов учитывать. Например, субпиксельное сглаживание. На цветной распечатке будут артефакты вокруг букв и тонких линий. А отключишь сглаживание — электронная версия будет страшненькая. Мы готовим иллюстрации рассчитанные на просмотр на мониторе — поддерживать еще и версии для печати слишком накладно.
                            0
                            По моему опыту никаких проблем не возникает при передаче в печать скриншотов, сделанных при включенном сглаживании шрифтов. Особенно если типография адекватная и не выдает откровенны брак при печати.

                            Артефакты будут, если кто-то догадается в JPEG сохранять скриншоты вместо TIFF (собственно, полиграфический стандарт).
                      +1
                      О, Ради Всего Святого Фомы!

                      Напишите скрипт, который будет сохранять файл в определенный каталог с именем, который состоит из текста и макросов вроде «текущее время час-минута-секунда»!

                      Умоляю!

                      Я тестировщик, и когда приходится работать под Ubuntu, делаю скриншоты с Gimp. А там приходится делать много лишних кликов при сохранении скриншота.

                      В SnagIt это дело рулит — одним нажатием скриншот сохраняется с уникальным именем (макросы рулят), а как сделать это в Gimp — хз, не владею ни скриптфу, ни лиспом, ни перлом, ни питоном (дальше перечислять?).

                      Тогда Gimp начнет рулить бесповоротно и в тестировании.
                        +6
                        У Святого Фомы не оказалось аккаунта на Хабре, так что он попросил меня запостить этот исходник :-)
                        (define (script-fu-instant-save image drawable)
                        	(let* (	(date-now (time))
                        		(year (number->string (+ (car date-now) 1900)))
                        		(month (number->string (+ (cadr date-now) 1)))
                        		(day (number->string (caddr date-now)))
                        		(time-now (cdddr date-now))
                        		(hour (number->string (car time-now)))
                        		(minute (number->string (cadr time-now)))
                        		(second (number->string(caddr time-now)))
                        		(filename)
                        		; можно вписать любой поддерживаемый тип файла
                        		(extension "png")
                        		; этот путь должен существовать
                        		(dir "/home/user/screenshots/") )
                        	(if (= (string-length month) 1) (set! month (string-append "0" month)))
                        	(if (= (string-length day) 1) (set! day (string-append "0" day)))
                        	(if (= (string-length hour) 1) (set! hour (string-append "0" hour)))
                        	(if (= (string-length minute) 1) (set! minute (string-append "0" minute)))
                        	(if (= (string-length second) 1) (set! second (string-append "0" second)))
                        	(set! filename (string-append 
                        		dir year "-" month "-" day "--" 
                        		hour "-" minute "-" second "." extension) )
                        	(gimp-file-save 1 image drawable filename filename)
                        	)
                        )
                        (script-fu-register "script-fu-instant-save" 
                                            "<Image>/File/Быстрое сохранение копии" ""
                                            "Saint Thomas" ""
                                            "23.10.2010"
                                            "*"
                                            SF-IMAGE "Image" 0
                                            SF-DRAWABLE "Drawable" 0 )
                        

                        Как подключить, должно быть понятно из текста статьи. В меню «Файл» появится «Быстрое сохранение копии». Результат — файл с именем вида YYYY-MM-DD--hh-mm-ss.png в /home/user/screenshots/.
                          0
                          Офигенно!

                          Я ваш идолопоклонник навеки!

                          Пойду протестирую скрипт.
                            0
                            Посмотрел в настройки моего Gimp. В качестве путей для хранения скриптов указано два адреса:
                            * c:\Documents and Settings\alexei\.gimp-2.6\scripts\
                            * p:\Program Files\GIMP\share\gimp\2.0\scripts\

                            Решил использовать первый:

                            1)
                            Заменил в скрипте строку
                            (dir "/home/user/screenshots/")
                            на
                            (dir «s:\_SnagIt_Catalog\»)

                            2)
                            Положил скрипт в C:\Documents and Settings\alexei\.gimp-2.6\scripts\quickSaveFile.scm

                            3)
                            Обновил сценарии в Gimp.

                            ПРОБЛЕМА
                            Ошибка при загрузке C:\Documents and Settings\alexei\.gimp-2.6\scripts\quickSaveFile.scm:

                            Error: eval: unbound variable: 

                            Ошибка при загрузке P:\Program Files\GIMP\share\gimp\2.0\scripts\3d-outline.scm:

                            Error: unmatched parentheses: 1


                            Wtf? При чем тут 3d-outline.scm? Я его вообще не трогал ни разу.

                            4)
                            Проверил в редакторе кода все скобки. Вроде ни одной лишней нет.

                            5)
                            Перезапустил Gimp. На стадии script-fu он наглухо задумался.

                            Минут через пять загрузился.

                            6)
                            Прошел в меню «Фильтры», но не нашел там пункта «Мои скрипты».

                            7)
                            Убрал скрипт из c:\Documents and Settings\alexei\.gimp-2.6\scripts\ и положил его в p:\Program Files\GIMP\share\gimp\2.0\scripts\.

                            8)
                            Перезапустил Gimp. Опять зависание на моменте загрузки script-fu.

                            9)
                            Убил процесс, убрал скрипт, перезапустил Gimop. Поднялся шустренько, как в свои самые молодые годы.

                            ВОПРОС

                            Что не так сделано, если предположить, что текст скрипта не менялся существенно?

                            Имеет ли значение кодировка документа scm?
                              0
                              Так.

                              Поиграл с названием файла и его кодировкой.

                              При принудительном обновлении сценариев достиг ошибки «Error: syntax error: illegal token 1»

                              Тут английским по-белому говорят, что
                              или
                              My guess is that you acquired some unwanted linefeeds in the comments. Comments extend from the first semi-colon up until the end of the line and therefore, if you split the comment over multiple lines then you must be sure to prepend a semicolon to the added lines.

                              или

                              One too many end paranthesises may also cause this error.

                              Где правда — хз.

                              Куда копать?

                              ЗЫ Ваш исходный скрипт из первого примера «script-fu-quick-shadow» поставил, применил — работает адекватно.
                                0
                                Вы написали:
                                Заменил в скрипте строку
                                (dir "/home/user/screenshots/")
                                на
                                (dir «s:\_SnagIt_Catalog\»)

                                Кавычки-елочки откуда-то взялись — поправьте на обычные.
                              +1
                              У меня на print screen висит команда
                              scrot '%Y-%m-%d-%T.png' -e 'mv $f ~/screenshots/'
                                0
                                Очень разумно, но большей частью весь экран захватывать не нужно (да и у меня два монитора), требуется URL да проблемное место на странице.
                                  0
                                  Тогда можно воспользоваться ImageMagic. Появится курсор для выбора области:
                                  import png:`date +'%Y-%m-%d-%T'`.png

                                    +1
                                    У scrot есть ключик -s: дает пользователю выбрать окно (сингл-кликом) либо произвольный регион.
                                    Ключик -b: при выборе окна шотить его с декорациями.

                                    Life is too short for manual pages, eh?
                                      +1
                                      Важно выбрать мануал правильной программы =)
                                  0
                                  scrot ~/screenshots/%Y-%m-%d-%T.png

                                  не?
                                  0
                                  Повесил себе на хоткей вот это:

                                  xfce4-screenshooter -r -o «cp -t /home/keks/screens „

                                  Автоматом схороняет выделенную область в нужную папку под именем вида “Снимок экрана — 28.10.2010 — 16:41:38.png», не задавая вообще никаких вопросов.
                                    0
                                    У меня алгоритм действий слегка другой:

                                    1) Сделать скриншот.

                                    2) Указать на нем проблемное место (или последовательность действий, или что еще — стрелки рисовать, в общем).

                                    3) Схоронить файл в нужную папку с именем вида “Снимок экрана — 28.10.2010 — 16:41:38.png», не задавая больше вообще никаких вопросов.
                                  +9
                                  В этой статье мы рассмотрим, как редактор растровой графики GIMP и его встроенный язык сценариев script-Fu могут пригодиться для подготовки иллюстраций.

                                  Neo - I know Kung-Fu
                                    –2
                                    Думаю есть у вас есть SnagIt то описаное вам не нужно. С ним поставляется редактор который умеет очень с много с нарисованого вами, а GIMP как из пушки по воробъям, да и технические писатели не вледеют обычно Lisp.
                                      +3
                                      Думаю есть у вас есть SnagIt то описаное вам не нужно. С ним поставляется редактор который умеет очень с много с нарисованого вами

                                      Мы уже писали, что результаты обработки во встроенном редакторе SnagIt нас не вполне устраивают. К тому же там нельзя создавать свои расширения :-)

                                      GIMP как из пушки по воробъям

                                      Это скорее про Photoshop…

                                      да и технические писатели не вледеют обычно Lisp.

                                      Кстати, автор статьи — технический писатель :-)
                                        0
                                        Кстати, автор статьи — технический писатель :-)

                                        Я это понял. Среди моих знакомых техписов наверное более 20. Програмировать вообще умеют человек 5 и то на Паскале школьные задачки и это очень много. LISP-ом не владеет ни единый. Учитывая что даже среди програмистов LISP не снискал большой популярности вероятность существования техписа с знаниями оного стремится к нулю. Это только чтобы проилюстрировать что ставить автора как пример немного неправильно.

                                        А за скрипт спасибо, может пригодится.
                                          +3
                                          Я это понял. Среди моих знакомых техписов наверное более 20. Програмировать вообще умеют человек 5 и то на Паскале школьные задачки и это очень много. LISP-ом не владеет ни единый. Учитывая что даже среди програмистов LISP не снискал большой популярности вероятность существования техписа с знаниями оного стремится к нулю. Это только чтобы проилюстрировать что ставить автора как пример немного неправильно.


                                          Ну, техрайтеры техрайтерам рознь. Тут многое зависит от предметной области, которую они описывают ;)

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

                                          Другое дело, что далеко не все, кто работает у нас техническими писателями, имеют именно «программистское» образование. Но вообще я верю, что базовым навыкам программирования может обучиться каждый, было бы достаточное количество времени на это и должное усердие.

                                          А вообще, смысл статьи, по-моему, был всё-таки не в том, что любой технический писатель должен проходить ровно тот же путь, что и автор: брать GIMP и писать скрипт на LISP. Смысл статьи в том, что есть бесплатный GIMP, есть скрипт, решающий проблему — берите и пользуйтесь, если кому надо. А если кто хочет, можете написать свой скрипт — для этого автор показывает, что там и как…
                                      +1
                                      Даже не подозревал что Gimp можно использовать таким макаром. Возьму на вооружение.
                                        +2
                                        Посмотрел в Shutter есть script-fu-quick-shadow подобный плагин назвается Hard Shadow и плагин для волновй обрезки. Но спасибо за статью всегда боялся=) подойти к лиспу=) с этой точки зрения. но все оказалось просто.

                                      Only users with full accounts can post comments. Log in, please.