Как написать собственный скрипт автоматической обрезки с помощью GIMP?

У меня есть куча снимков экрана, и я хотел бы обрезать границу окна. Я хотел бы обрезать их все с помощью скрипта.

У меня есть доступ к GIMP, но не к фотошопу, поэтому я предположил, что GIMP будет лучшим инструментом для использования. Раньше я не писал сценарии в GIMP, поэтому я нашел несколько сценариев обрезки GIMP. Те, что я нашел, все похожи на то, что я хочу, но не совсем. Я думал, что будет просто изменить сценарий на то, что мне нужно. Но так как я не знаком с языком сценариев, это оказалось сложнее, чем я думал. Я нашел отличный скрипт автоматической обрезки здесь. Может ли кто-нибудь помочь мне настроить его для того, что мне нужно?

    (define (script-fu-rs-center-crop filename outfilename width height)

  (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
          (drawable (car (gimp-image-get-active-layer image))))
          (let* ((original-width (car (gimp-image-width image)))
               (original-height (car (gimp-image-height image)))
               (new-width original-width)
               (new-height original-height)
               (offset-x 0)
               (offset-y 0))

               (if (<= (/ original-width original-height) (/ width height))
                   (gimp-image-crop image original-width (* original-width (/ height width)) 0 (/ (- original-height (* original-width (/ height width))) 2) )
                   (gimp-image-crop image (* original-height (/ width height)) original-height (/ (- original-width (* original-height (/ width height))) 2) 0)
               )
           )

  (set! drawable (car (gimp-image-get-active-layer image)))

(gimp-file-save RUN-NONINTERACTIVE image drawable outfilename outfilename)
     (gimp-image-delete image)))

Габаритные размеры не одинаковы для всех фотографий. Но все они имеют одинаковое количество пикселей сверху, слева, справа и снизу, которые я хочу обрезать. Допустим, размер изображения составляет width и height в пикселях, и я хочу удалить t_junk пикселей сверху, b_junk пикселей снизу, l_junk пикселей слева и r_junk пикселей справа. Поэтому я хочу, чтобы новые размеры изображения были width - l_junk - r_junk и height - t_junk - b_junk.


person Stainsor    schedule 27.04.2011    source источник
comment
Почему бы не использовать imagemagick? Этот convert метод может быть довольно простым.   -  person Blender    schedule 28.04.2011


Ответы (2)


Сценарий кромки

Я написал собственный скрипт GIMP, который делает именно то, что вы просили. Просто вставьте следующее в текстовый документ и сохраните его с расширением .scm в папке сценариев GIMP (путь можно найти/создать в Edit > Preferences > Folders > Scripts):

(define (script-fu-wirebear-edger filename outfilename top right bottom left)
(let* (
    (img (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
    (owidth (car (gimp-image-width img)))
    (oheight (car (gimp-image-height img)))
    (width (- owidth (+ right left)))
    (height (- oheight (+ top bottom)))
      )

   ;Crop Image
    (gimp-image-crop img width height left top)

   ;Save
    (gimp-file-save RUN-NONINTERACTIVE
        img
        (car (gimp-image-active-drawable img))
        outfilename
        outfilename)

   ;Cleanup
    (gimp-image-delete img)
))
(script-fu-register "script-fu-wirebear-edger"
    "Edger"
    "Removes junk from the edges of an image"
    "Chris Kent"
    "WireBear.com"
    "August 2011"
    "RGB* GRAY*"
    SF-STRING "Filename" ""
    SF-STRING "OutputFilename" ""
    SF-VALUE "TopEdge" "0"
    SF-VALUE "RightEdge" "0"
    SF-VALUE "BottomEdge" "0"
    SF-VALUE "LeftEdge" "0"
)
script-fu-wirebear-edger()

Этот скрипт принимает имя входного файла, имя выходного файла и количество пикселей, которые нужно сбрить с каждой стороны. Вы можете запустить команду из Windows (при условии, что GIMP настроен как переменная среды) следующим образом (не забудьте экранировать специальные символы, как показано, и разместить их в одной строке) :

C:>gimp-2.6 -i -c -b
   "(script-fu-wirebear-edger \"C:\\Users\\You\\Desktop\\Images\\1.png\" 
   \"C:\\Users\\You\\Desktop\\Images\\1_edged.png\" 10 30 25 5)"
   -b "(gimp-quit 0)"

Или вы можете запустить его в Консоли Script-Fu (Filters > Script-Fu > Console) независимо от ОС, например:

(script-fu-wirebear-edger "C:\\Users\\You\\Desktop\\Images\\1.png" 
"C:\\Users\\You\\Desktop\\Images\\1_edged.png" 10 30 25 5)

Скрипт пакетной обработки

Чтобы запустить сценарий Edger на нескольких изображениях, вы можете использовать следующий сценарий в сочетании с приведенным выше сценарием (вам потребуются оба в папке «Сценарии»):

(define (script-fu-wirebear-batch-edger pattern outsuffix top right bottom left)
(let* (
    (filelist (cadr (file-glob pattern 1)))
    (filename "")
    (outfn "")
      )
    (while (not (null? filelist))
        (set! filename (car filelist))
        (set! outfn 
            (string-append 
                (string-append 
                    (substring filename 0 (- (string-length filename) 4))
                    outsuffix)
                (substring filename (- (string-length filename) 4))
            )
        )
        (script-fu-wirebear-edger filename outfn top right bottom left)
        (set! filelist (cdr filelist))
    )
))
(script-fu-register "script-fu-wirebear-batch-edger"
    "Batch Edger"
    "Removes junk from the edges of a series of images"
    "Chris Kent"
    "WireBear.com"
    "August 2011"
    "RGB* GRAY*"
    SF-STRING "Pattern" "*.png"
    SF-STRING "OutputSuffix" "_edged"
    SF-VALUE "TopEdge" "0"
    SF-VALUE "RightEdge" "0"
    SF-VALUE "BottomEdge" "0"
    SF-VALUE "LeftEdge" "0"
)
script-fu-wirebear-batch-edger()

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

C:>gimp-2.6 -i -c -b
   "(script-fu-wirebear-batch-edger \"C:\\Users\\You\\Desktop\\Images\\*.png\" 
   \"_edged\" 10 30 25 5)"
   -b "(gimp-quit 0)"

Или вы можете запустить его в Консоли Script-Fu (Filters > Script-Fu > Console) — независимо от ОС, вот так:

(script-fu-wirebear-batch-edger "C:\\Users\\You\\Desktop\\Images\\*.png"
"_edged" 10 30 25 5)
person theChrisKent    schedule 09.08.2011
comment
ПРЕКРАСНО!! Лучше поздно, чем никогда! Это именно то, что я хотел... Я должен сказать именно то, что я ПРОШУ. Теперь, когда я начал его использовать, я понимаю, что мне бы понравилось еще больше, если бы я мог указать координаты пикселей (относительно верхнего левого угла), которые я хочу видеть в кадре. Я использую Paint/GIMP, я помещаю курсор в верхний левый угол раздела, который хочу сохранить, и записываю позицию, которую он сообщает. Затем я делаю то же самое для нижнего правого угла. В идеале я мог бы использовать эти числа напрямую, а не использовать их для создания входных данных для вашего потрясающего сценария. Не слишком ли много просить о пересмотре? :D - person Stainsor; 30.08.2011
comment
О, а можно ли написать скрипт, который многократно запускает этот скрипт для нескольких файлов? Что-то вроде: (script-fu-wirebear-edger C:\\1.png C:\\1e.png 1 2 3 4) (script-fu-wirebear-edger C:\\2.png C:\\2e .png 1 2 3 4) (script-fu-wirebear-edger C:\\3.png C:\\3e.png 1 2 3 4) - person Stainsor; 30.08.2011
comment
@Stainsor Я добавил скрипт Batch Edger выше, который позволит вам запустить скрипт в папке, полной изображений. Что касается вашего первого запроса об указании координат пикселей, я не уверен, что точно понимаю, что вы ищете. - person theChrisKent; 31.08.2011