2016-10-02 100 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

如果您旋转矩形图像,则必须获取稍大的图像或剪下部分数据。通常感兴趣的区域实际上是大致圆形的,并且角落可以是背景或透明的。然而,旋转算法不太可能为您做出决定。

如果您迭代旋转,您不但会得到大小的累积,还会因为像素不匹配而看到累积或错误(要查看如何抑制此效应,请在二进制图像库中查找rotatebyshear (here)所以你需要始终从你的原始图像开始,并应用总旋转

0

如果你比较gimp-item-transform-rotate到它现在不赞成使用的前奏,你会请注意它有一个称为剪辑结果的附加参数,具有四个可能的值(parens中的数字是选项的数值):

  • 变换RESIZE-ADJUST(0)
  • 变换RESIZE-CLIP(1)
  • 变换RESIZE-CROP(2)
  • 变换RESIZE-CROP-WITH-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。这些选项对于转换工具来说很常见,顺便说一句。

马尔科姆回​​答中指出的错误积累问题依然存在。您肯定想要通过累积角度旋转原始图层的副本,而不是一遍又一遍旋转同一图层。