Alberto Zanovello
Alberto Zanovello

Reputation: 59

image.Decode fail on golang embed

The purpose of this program in to decode a img embedded with "embed". The image (bu.png) is in the same directory of the main.go.

package main

import (
    "bytes"
    _ "embed"
    "image"
)

var (
    //go:embed bu.png
    img []byte
)

func main() {

    a  := bytes.NewBuffer(img)
    a, b, e := image.Decode()
    println(e.Error())
    //  image: unknown format

    println(b)
    //

    println(a)
    // (0x0,0x0)

    // println(string(img))
    // the text of the image seem a little different between nano

}

the image data shold be in the img variabile cause "embed" import

Upvotes: 1

Views: 2484

Answers (1)

erik258
erik258

Reputation: 16302

This isn't an embed thing. You have to import the individual libraries you want to support. Their initialization will register their formats for use by image.Decode. To quote the aforelinked,

Decoding any particular image format requires the prior registration of a decoder function.

Try adding an import like,

_ "image/png"

I tested this with the following, which should convince you that embed is irrelevant:

package main

import (
    _ "embed"
    "fmt"
    "bytes"
    "image"
    //_ "image/png"
    //_ "image/jpeg"
    //_ "image/gif"
    "os"
)

var (
    //go:embed bu.png
    img []byte
)

func main() {
    f, err := os.Open("bu.png")
    if err != nil {
        panic(fmt.Errorf("Couldn't open file: %w", err))
    }
    defer f.Close()
    fmt.Println(image.Decode(f))
    buf := bytes.NewBuffer(img)
    fmt.Println(image.Decode(buf))

}

Upvotes: 11

Related Questions