2016-10-02 8 views
3

Я хочу, чтобы пользователь рисовал что-то. Я буду вращать это изображение много раз, и я сохраню каждый файл в папке. Шаблон img<degree>.png, например img24.png - оригинальное изображение, повернутое на 24 градуса. Это похоже на использование Rotate tool, установите его на 24 градуса и экспортируйте его по умолчанию.Повторное вращение - увеличение размера изображения при экспорте в png

Проблема в том, что каждый раз, когда я вращаюсь и экспортирую в png, файлы становятся все больше и больше. Когда исходный файл 100x100 & 380B, 9-й файл 413x412 2,47KB. Я хочу, чтобы изображения оставались одного размера (100x100 в приведенном выше примере).

(define (degrees-to-radians degrees) (/ (* degrees *pi*) 180)) 
(define (script-fu-rotate-and-save in-image in-drawable directory-name) ; degree) 

    (let ((ind 0) (x 0) (y 0)) 
    (while (< ind 361) 
     (set! x (car (gimp-image-width in-image))) 
     (set! y (car (gimp-image-height in-image))) 
     (gimp-item-transform-rotate in-drawable (degrees-to-radians ind) FALSE (/ x 2) (/ y 2)) 
     (file-png-save-defaults 1 in-image in-drawable (string-append directory-name "/img" (number->string ind) ".png") (string-append directory-name "/temp.png")) 
     (set! ind (+ ind 45)) 
    ) 
) 
    ;(gimp-displays-flush) ; show changes on image 
) 
(script-fu-register 
    "script-fu-rotate-and-save" ;name 
    "rotate and save" 
    "Rotates and saves" 
    "me" 
    "copyrights" 
    "today" 
    "" 
    SF-IMAGE "image-main" 0 
    SF-DRAWABLE "drawable-main" 0 
    SF-DIRNAME "directory-name" "" 
    ;SF-ADJUSTMENT "label" '(value lower upper step_inc page_inc digits type) 
    ;SF-ADJUSTMENT "degree" '(1 1 360 1 1 0 0) 
) 
(script-fu-menu-register "script-fu-rotate-and-save" "<Image>/Rotate and save") 

ответ

3

Если вы поворачиваете прямоугольное изображение, вы должны либо получить изображение чуть большего размера, либо отрезать некоторые из этих данных. Часто область интересов на самом деле примерно круглая, а углы либо фоновые, либо прозрачные. Однако маловероятно, что алгоритм rotate сделает это решение для вас.

Если вы итеративно вращаетесь, вы получаете не только накопление размера, но и получаете накопление или ошибку, потому что пиксели не совпадают (чтобы увидеть, как подавить этот эффект, найдите rotatebyshear в библиотеке бинарных изображений (here) Таким образом, изображение начнет размываться, поэтому вам нужно всегда начинать с исходного изображения и применять полное вращение.

0

Если вы сравниваете gimp-item-transform-rotate с его - теперь устаревшим - предшественником, вы будете обратите внимание, что он имеет дополнительный параметр, называемый клиентом, с четырьмя возможными значениями (число в парнах - это числовое значение опции):

  • ТРАНСФОРМ-ИЗМЕНИТЬ-ADJUST (0)
  • ТРАНСФОРМ-ИЗМЕНИТЬ-CLIP (1)
  • спектрально-RESIZE кадрирования (2)
  • ТРАНСФОРМ-ИЗМЕНИТЬ-УРОЖАЙ-С-ASPECT (3)

Текущий gimp-item- * API получает значение из текущего контекста, gimp-context-set-transform-resize используется для установки желаемого значения.

По умолчанию TRANSFORM-RESIZE-ADJUST (0) - это увеличивает уровень на каждом повороте, и если вы снова и снова поворачиваете один и тот же слой, результаты становятся все больше и больше.

Вы хотите попробовать TRANSFORM-RESIZE-CLIP (1) - этот клип поворачивает слой до первоначального размера.

Остальные два варианта немного сложнее понять - там вы определенно хотите have a look at the user manual. Эти параметры являются общими для инструментов преобразования, кстати.

Проблема с накоплением ошибок, как указано в ответе Малкольма, остается. вы определенно хотите повернуть копию исходного слоя на накопленный угол, вместо того, чтобы снова и снова поворачивать один и тот же слой.