2016-10-02 2 views
3

Je veux qu'un utilisateur dessine quelque chose. Je vais faire pivoter cette image plusieurs fois et je vais enregistrer chaque fichier dans un dossier. Un modèle est img<degree>.png, par exemple img24.png est l'image originale pivotée de 24 degrés. C'est comme utiliser Rotate tool, réglez-le à 24 degrés et l'exporter avec des séances par défaut. Le problème est que chaque fois que je tourne et que j'exporte vers png, les fichiers deviennent de plus en plus gros. Lorsque le fichier d'origine est 100x100 & 380B, le 9ème fichier est 413x412 2,47KB. Je veux que les images restent à la même taille (100x100 dans l'exemple ci-dessus).Rotation répétée - augmentation de la dimension de l'image à l'exportation vers png

(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") 

Répondre

3

Si vous faites pivoter une image rectangulaire, vous devez soit obtenir une image légèrement plus grande, soit couper certaines de ces données. Souvent, la zone d'intérêt est en fait plus ou moins circulaire et les coins sont en arrière-plan ou transparents. Cependant, il est peu probable qu'un algorithme de rotation prenne cette décision pour vous. Si vous faites pivoter itérativement, vous obtenez non seulement une accumulation de taille, mais aussi une accumulation ou une erreur car les pixels ne correspondent pas (pour voir comment supprimer cet effet, recherchez rotatebyshear, dans la bibliothèque d'images binaires (here) L'image commencera donc à se brouiller, donc vous devez toujours commencer à partir de votre image originale et appliquer la rotation totale

0

Si vous comparez gimp-item-transform-rotate à son prédécesseur - now deprecated -, notez qu'il a un paramètre supplémentaire appelé clip-result, avec quatre valeurs possibles (le nombre en parens est la valeur numérique de l'option):

  • transform-RESIZE-adjust (0)
  • TRANSFORM-RESIZE-CLIP (1)
  • TRANSFORM-RESIZE-CROP (2)
  • TRANSFORM-RESIZE-CROP-EN-ASPECT (3)

L'API gimp-item- * actuelle récupère la valeur du contexte actuel, gimp-context-set-transform-resize est utilisé pour définir la valeur que vous désirez. La valeur par défaut est TRANSFORM-RESIZE-ADJUST (0) - cela agrandit le calque à chaque rotation, et si vous faites tourner le même calque encore et encore, les résultats deviennent de plus en plus gros.

Vous voulez essayer TRANSFORM-RESIZE-CLIP (1) - ce clip permet de faire pivoter la couche à la taille d'origine.

Les deux options restantes sont un peu plus difficiles à comprendre - là vous voulez absolument have a look at the user manual. Ces options sont communes aux outils de transformation, btw.

Le problème d'accumulation d'erreur, comme indiqué dans la réponse de Malcolm, demeure. vous voulez absolument faire pivoter une copie du calque d'origine par l'angle accumulé, au lieu de faire tourner le même calque encore et encore.