mirror of
https://github.com/IllusionMan1212/gif-cropper-wasm.git
synced 2026-10-24 02:12:39 +00:00
initial commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
wasm_exec.js
|
||||
gif-encoder.wasm
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"go.buildTags": "js,wasm",
|
||||
|
||||
// other
|
||||
"[json]": {
|
||||
"editor.defaultFormatter": "vscode.json-language-features",
|
||||
},
|
||||
"git.branchPrefix": "feat/",
|
||||
"git.branchProtection": [ "master" ],
|
||||
"git.branchProtectionPrompt": "alwaysPrompt",
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
//go:build js && wasm
|
||||
// +build js,wasm
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/color/palette"
|
||||
"image/draw"
|
||||
"image/gif"
|
||||
"image/png"
|
||||
"log"
|
||||
"syscall/js"
|
||||
)
|
||||
|
||||
func encodeGif(this js.Value, args []js.Value) interface{} {
|
||||
inImages := args[0]
|
||||
delays := args[1]
|
||||
disposals := args[2]
|
||||
|
||||
outImages := make([]*image.Paletted, 0)
|
||||
delay := make([]int, 0)
|
||||
disposal := make([]byte, 0)
|
||||
|
||||
// Plan9 palette doesn't include transparent colors
|
||||
// so we use WebSafe and add transparent color
|
||||
myPalette := append(palette.WebSafe, image.Transparent)
|
||||
opts := gif.Options{
|
||||
NumColors: 256,
|
||||
Drawer: draw.FloydSteinberg,
|
||||
}
|
||||
|
||||
fmt.Println(inImages.Length())
|
||||
for i := 0; i < inImages.Length(); i++ {
|
||||
imgBytes := make([]byte, inImages.Index(i).Length())
|
||||
js.CopyBytesToGo(imgBytes, inImages.Index(i))
|
||||
|
||||
reader := bytes.NewReader(imgBytes)
|
||||
img, err := png.Decode(reader)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
b := img.Bounds()
|
||||
pimg := image.NewPaletted(b, myPalette)
|
||||
opts.Drawer.Draw(pimg, b, img, image.ZP)
|
||||
|
||||
outImages = append(outImages, pimg)
|
||||
delay = append(delay, delays.Index(i).Int())
|
||||
disposal = append(disposal, byte(disposals.Index(i).Int()))
|
||||
}
|
||||
|
||||
outGif := &gif.GIF{
|
||||
Image: outImages,
|
||||
Delay: delay,
|
||||
LoopCount: 0,
|
||||
Disposal: disposal,
|
||||
BackgroundIndex: 0,
|
||||
}
|
||||
|
||||
outBytes := new(bytes.Buffer)
|
||||
err := gif.EncodeAll(outBytes, outGif)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
return js.CopyBytesToJS(args[3], outBytes.Bytes())
|
||||
}
|
||||
|
||||
func main() {
|
||||
done := make(chan struct{}, 0)
|
||||
js.Global().Set("encodeGif", js.FuncOf(encodeGif))
|
||||
<-done
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"image"
|
||||
"image/color/palette"
|
||||
"image/draw"
|
||||
"image/gif"
|
||||
"image/png"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
log.Fatal("No directory or file provided.")
|
||||
}
|
||||
|
||||
path := os.Args[1]
|
||||
|
||||
if path == "" {
|
||||
log.Fatal("No directory or file provided.")
|
||||
}
|
||||
|
||||
files, err := ioutil.ReadDir(path)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
images := make([]*image.Paletted, 0)
|
||||
delay := make([]int, 0)
|
||||
disposal := make([]byte, 0)
|
||||
|
||||
for _, fileInfo := range files {
|
||||
if fileInfo.IsDir() {
|
||||
continue
|
||||
}
|
||||
|
||||
file, err := os.OpenFile(filepath.Join(path, fileInfo.Name()), os.O_RDWR, os.ModeExclusive)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to open file")
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
img, err := png.Decode(file)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
opts := gif.Options{
|
||||
NumColors: 256,
|
||||
Drawer: draw.FloydSteinberg,
|
||||
}
|
||||
b := img.Bounds()
|
||||
myPalette := append(palette.WebSafe, image.Transparent)
|
||||
pimg := image.NewPaletted(b, myPalette)
|
||||
opts.Drawer.Draw(pimg, b, img, image.ZP)
|
||||
|
||||
images = append(images, pimg)
|
||||
delay = append(delay, 10)
|
||||
disposal = append(disposal, 2)
|
||||
}
|
||||
|
||||
outGif := &gif.GIF{
|
||||
Image: images,
|
||||
Delay: delay,
|
||||
LoopCount: 0,
|
||||
Disposal: disposal,
|
||||
BackgroundIndex: 40,
|
||||
}
|
||||
|
||||
out, err := os.Create("out.gif")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer out.Close()
|
||||
err = gif.EncodeAll(out, outGif)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user