PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Sunday, July 17, 2022

[FIXED] How can I rotate an image in a loop in order to create a GIF in golang?

 July 17, 2022     gif, go, image-processing     No comments   

Issue

I want to repeatedly rotate an image in a loop, in order to create a GIF, using Go's various image processing tools, but I can't seem to figure out what I'm doing wrong. Here, Gwenview reports that the GIF produced is not animated, and contains only one frame.


package main

import (
    "image"
    "image/color/palette"
    "image/color"
    "image/gif"
    "image/draw"
    "io"
    "os"
    "github.com/disintegration/imaging"
)



func main() {
    rotate(os.Stdout)
}

func rotate(out io.Writer) {


    f, _ := os.Open("myimage.png")
    defer f.Close()
    base, _, _ := image.Decode(f)
    const (
        rot     = 45    // degrees
        nframes = 5    // number of animation frames
        delay   = 20     // delay between frames in 10ms units
    )
    bounds  := base.Bounds()


    anim := gif.GIF{LoopCount: nframes}

    for i := 0; i < nframes; i++ {
        img := imaging.Rotate(base, float64(360 - (rot * i)), color.Transparent)
        bounds = img.Bounds()
        palettedImg := image.NewPaletted(bounds, palette.Plan9)
        draw.Draw(palettedImg, bounds, img, bounds.Min, draw.Src)

        anim.Delay = append(anim.Delay, delay)
        anim.Image = append(anim.Image, palettedImg)
    }
    gif.EncodeAll(out, &anim) // NOTE: ignoring encoding errors
}

Solution

The problem is indeed that you are ignoring the error messages. Never do that, always handle the errors accurately! In your specific case your example is not working because you are setting the newly created image bounds to the original image, but because on each frame iteration you are rotating the image, their dimensions are going outside of the original bounds. If you didn't ignored the encoding errors, you could captured what's going wrong.

err := gif.EncodeAll(out, &anim)
if err != nil {
    fmt.Printf("%v", err)
}

The error:

$ gif: image block is out of bounds  


Answered By - Endre Simo
Answer Checked By - Katrina (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing