標準ないし準標準 (golang.org/x/image/webp みたいな) にはないので面倒っぽそうだなあとなんとなく思ってたけど意外にも簡単に対応できた。
CGo を許容するかで今のところ2択っぽい
- _ "github.com/vegidio/avif-go" CGo
- _ "github.com/gen2brain/avif"
libavifを WASM にコンパイルし、wazeroで実行
どっちもブランクインポートするだけでつかえる。ベンチ的には CGo のほうが10倍早い
こういう検証とベンチをむちゃくちゃサクっとやれるのすごいいいよなあ。Agentic Coding。脳の負荷が位置が変わっているのを感じる。
検証
vegidio/avif-go
# register_vegidio_test.go
package main
import (
"bytes"
"image"
"os"
"testing"
_ "github.com/vegidio/avif-go"
)
func TestRegisterVegidio(t *testing.T) {
data, err := os.ReadFile("../../static/fixtures/sample.avif")
if err != nil {
t.Fatal(err)
}
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
t.Fatalf("Vegidio registration failed: %v", err)
}
t.Logf("Successfully decoded %dx%d %s image using vegidio", img.Bounds().Dx(), img.Bounds().Dy(), format)
if format != "avif" {
t.Errorf("Expected format avif, got %s", format)
}
}
go test -v register_vegidio_test.go
=== RUN TestRegisterVegidio
register_vegidio_test.go:23: Successfully decoded 2886x2164 avif image using vegidio
--- PASS: TestRegisterVegidio (0.08s)
PASS
ok command-line-arguments 0.313s
github.com/gen2brain/avif
# register_gen2brain_test.go
package main
import (
"bytes"
"image"
"os"
"testing"
_ "github.com/gen2brain/avif"
)
func TestRegisterGen2brain(t *testing.T) {
data, err := os.ReadFile("../../static/fixtures/sample.avif")
if err != nil {
t.Fatal(err)
}
img, format, err := image.Decode(bytes.NewReader(data))
if err != nil {
t.Fatalf("Gen2brain registration failed: %v", err)
}
t.Logf("Successfully decoded %dx%d %s image using gen2brain", img.Bounds().Dx(), img.Bounds().Dy(), format)
if format != "avif" {
t.Errorf("Expected format avif, got %s", format)
}
}
go test -v register_gen2brain_test.go
=== RUN TestRegisterGen2brain
register_gen2brain_test.go:23: Successfully decoded 2886x2164 avif image using gen2brain
--- PASS: TestRegisterGen2brain (0.73s)
PASS
ok command-line-arguments 1.119s