重复旋转 - 在导出到png时增加图像尺寸

时间:2016-10-02 09:44:00

标签: gimp script-fu

我希望用户绘制一些东西。我会多次旋转该图像,然后将每个文件保存到一个文件夹中。模板为img<degree>.png,例如img24.png是旋转24度的原始图像。它就像使用Rotate tool一样,将其设置为24度并使用默认坐位导出。

问题在于每次我旋转并导出到png文件越来越大。当原始文件是100x100&amp; 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")

2 个答案:

答案 0 :(得分:3)

如果旋转矩形图像,则必须获得稍大的图像,或者剪切掉一些数据。通常,感兴趣的区域实际上是大致圆形的并且角落是背景或透明的。但是,旋转算法不太可能为您做出决定。

如果你迭代旋转,你不仅会得到一个大小的积累,你也会得到一个积累或错误,因为像素不匹配(看看如何抑制这种效果,在二进制图像库中查找rotatebyshear {{ 3}}。因此图像将开始模糊。所以你需要始终从原始图像开始,然后应用总旋转。

答案 1 :(得分:0)

如果你将gimp-item-transform-rotate与它的 - 现已弃用的 - 前任进行比较,你会发现它有一个额外的参数,称为clip-result,有四个可能的值(parens中的数字是该数字的值)选项):

  • TRANSFORM-RESIZE-ADJUST(0)
  • TRANSFORM-RESIZE-CLIP(1)
  • TRANSFORM-RESIZE-CROP(2)
  • TRANSFORM-RESIZE-CROP-WITH-ASPECT(3)

当前gimp-item- * API从当前上下文中获取值,gimp-context-set-transform-resize用于设置所需的值。

默认值为TRANSFORM-RESIZE-ADJUST(0) - 这会在每次旋转时放大图层,如果一遍又一遍地旋转同一层,结果会变得越来越大。

您想尝试TRANSFORM-RESIZE-CLIP(1) - 这会将旋转的图层剪辑为原始尺寸。

剩下的两个选项有点难以理解 - 你绝对想要https://jsfiddle.net/6r4o5278/6/。这些选项对转换工具很常见,顺便说一句。

Malcolm的回答中指出的错误积累问题仍然存在。你肯定想用累积的角度旋转原始图层的副本,而不是一遍又一遍地旋转同一层。