ZhangZhihui's Blog  

Problem: You want to load an image from an image file.


Solution: Use image.Decode to decode data from an image file into an implementation of image.Image .

 

If you want to work with an image from a file, you have to open up the file and then decode its content. To do this, you should already know what kind of file you are dealing with and register the type accordingly:

func load(filePath string) (*image.NRGBA, error) {
    imgFile, err := os.Open(filePath)
    if err != nil {
        log.Println("Cannot read file:", err)
    }
    defer imgFile.Close()

    img, _, err := image.Decode(imgFile)
    if err != nil {
        log.Println("Cannot decode file:", err)
    }
    rimg, ok := img.(*image.NRGBA)
    if ok {
        return rimg, nil
    }
    return nil, errors.New("cannot type assert image")
}

First, you need to open a file. Then using image.Decode , you decode it into the img variable. The Decode method returns three values: the first is what you want to get, the image.Image value; the second is a string signifying the format of the image; and the third is the usual error value.

Take a closer look at the img value. Since you get an Image value, why do you want to type assert to image.NRGBA before you return it? This is because Image is an interface, and NRGBA is the actual implementation:

type NRGBA struct {
    Pix    []uint8
    Stride int
    Rect   Rectangle
}

In other words, you can manipulate the NRGBA but you can’t manipulate an Image . Of course, you can still call methods on Image but you can’t directly manipulate it unless you get a hold of the underlying implementation.

 

posted on 2023-10-10 10:06  ZhangZhihuiAAA  阅读(10)  评论(0编辑  收藏  举报