Go - Loading an Image from a File

发布时间 2023-10-10 10:11:08作者: ZhangZhihuiAAA

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.