載入和儲存影象

在儲存器中,影象可以被視為畫素(顏色)的矩陣。但是,當影象儲存在永久儲存器中時,它可以按原樣儲存(RAW 格式),點陣圖或其他具有特定壓縮演算法的影象格式,以節省儲存空間,例如 PNG,JPEG,GIF 等。載入影象時對於特定格式,必須使用相應的演算法將影象解碼image.Image。一個 image.Decode函式宣告為

func Decode(r io.Reader) (Image, string, error)

提供此特定用法。為了能夠處理各種影象格式,在呼叫 image.Decode 函式之前,解碼器必須通過定義為 image.RegisterFormat函式進行註冊。

func RegisterFormat(name, magic string, 
    decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error))

目前,影象包支援三種檔案格式: JPEGGIFPNG 。要註冊解碼器,請新增以下內容

import _ "image/jpeg"    //register JPEG decoder

到應用程式的 main 包。在程式碼中的某處(main 包中不需要),要載入 JPEG 影象,請使用以下程式碼段:

f, err := os.Open("inputimage.jpg")
if err != nil {
    // Handle error
}
defer f.Close()

img, fmtName, err := image.Decode(f)
if err != nil {
    // Handle error
}

// `fmtName` contains the name used during format registration
// Work with `img` ...

儲存到 PNG

要將影象儲存為特定格式,必須明確匯入相應的編碼器,即

import "image/png"    //needed to use `png` encoder

然後可以使用以下程式碼段儲存影象:

f, err := os.Create("outimage.png")
if err != nil {
    // Handle error
}
defer f.Close()

// Encode to `PNG` with `DefaultCompression` level
// then save to file
err = png.Encode(f, img)
if err != nil {
    // Handle error
}

如果要指定 DefaultCompression 級別以外的壓縮級別,請建立編碼器,例如

enc := png.Encoder{
    CompressionLevel: png.BestSpeed,
}
err := enc.Encode(f, img)

儲存為 JPEG

要儲存為 jpeg 格式,請使用以下命令:

import "image/jpeg"

// Somewhere in the same package
f, err := os.Create("outimage.jpg")
if err != nil {
    // Handle error
}
defer f.Close()

// Specify the quality, between 0-100
// Higher is better
opt := jpeg.Options{
    Quality: 90,
}
err = jpeg.Encode(f, img, &opt)
if err != nil {
    // Handle error
}

儲存到 GIF

要將影象儲存為 GIF 檔案,請使用以下程式碼段。

import "image/gif"

// Samewhere in the same package
f, err := os.Create("outimage.gif")
if err != nil {
    // Handle error
}
defer f.Close()

opt := gif.Options {
    NumColors: 256, 
    // Add more parameters as needed
}

err = gif.Encode(f, img, &opt)
if err != nil {
    // Handle error
}