[ebiten] pngファイルが読み込めない

最近、ebitenを触り始めたので、気づいたことを共有していきたい。

ネット上にあったサンプルコードを参考に、まずは適当に画像ファイルを表示しようとしたのが以下のコード。

main.go

package main

import (
	"bytes"
	_ "embed"
	"log"
	"image"
	"image/color"

	"github.com/hajimehoshi/ebiten/v2"
)


//go:embed resource/sample.png
var byteSampleImg []byte

type Game struct {
	stage		int
}

func NewGame() *Game {
	g := &Game{}
	return g
}

func (g *Game) Update() error {
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	img, _, err := image.Decode(bytes.NewReader(byteSampleImg))
	if err != nil {
		log.Fatal(err)
	}
	sampleImg = ebiten.NewImageFromImage(img)

	screen.Fill(color.White)

	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(100, 100)
	op.Filter = ebiten.FilterLinear
	screen.DrawImage(sampleImg, op)
}

# 略

これで、

2023/06/11 23:31:06 image: unknown format

というエラーになった。pngファイルのビット深度とかに規定があるのかな、と思ったけど、ネット上にあるサンプルコードのpngファイルを使っても変化なし。

答えは単純で、image/png をimport する必要があっただけだった。

package main

import (
	"bytes"
	_ "embed"
	"log"
	"image"
	_ "image/png"
	"image/color"

	"github.com/hajimehoshi/ebiten/v2"
)


//go:embed resource/sample.png
var byteSampleImg []byte

type Game struct {
	stage		int
}

func NewGame() *Game {
	g := &Game{}
	return g
}

func (g *Game) Update() error {
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	img, _, err := image.Decode(bytes.NewReader(byteSampleImg))
	if err != nil {
		log.Fatal(err)
	}
	sampleImg = ebiten.NewImageFromImage(img)

	screen.Fill(color.White)

	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(100, 100)
	op.Filter = ebiten.FilterLinear
	screen.DrawImage(sampleImg, op)
}

# 略

これでOK。

jpegの場合は image/jpeg を import すればよい。