基本概念

影象表示影象元素( 畫素 ) 的矩形網格。在影象包中,畫素被表示為影象/顏色包中定義的顏色之一 。影象的二維幾何形狀表示為 image.Rectangle ,而 image.Point表示網格上的位置。

https://i.stack.imgur.com/PbRoJ.jpg

上圖說明了包中影象的基本概念。尺寸 15x14 畫素的影象具有矩形邊界處開始左上拐角(例如座標(-3,-4)在如上圖所示),它的軸增加向右和向下到右下拐角(例如座標(圖 10 中的圖 10)。請注意,邊界不一定從點(0,0)開始或包含點(0,0)

影象相關型別

Go 中,影象始終實現以下 image.Image 介面

type Image interface {
    // ColorModel returns the Image's color model.
    ColorModel() color.Model
    // Bounds returns the domain for which At can return non-zero color.
    // The bounds do not necessarily contain the point (0, 0).
    Bounds() Rectangle
    // At returns the color of the pixel at (x, y).
    // At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.
    // At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.
    At(x, y int) color.Color
}

其中 color.Color 介面定義為

type Color interface {
    // RGBA returns the alpha-premultiplied red, green, blue and alpha values
    // for the color. Each value ranges within [0, 0xffff], but is represented
    // by a uint32 so that multiplying by a blend factor up to 0xffff will not
    // overflow.
    //
    // An alpha-premultiplied color component c has been scaled by alpha (a),
    // so has valid values 0 <= c <= a.
    RGBA() (r, g, b, a uint32)
}

color.Model 是一個宣告為的介面

type Model interface {
    Convert(c Color) Color
}

訪問影象尺寸和畫素

假設我們將影象儲存為變數 img,那麼我們可以通過以下方式獲得尺寸和影象畫素:

// Image bounds and dimension
b := img.Bounds()
width, height := b.Dx(), b.Dy()
// do something with dimension ...

// Corner co-ordinates
top := b.Min.Y
left := b.Min.X
bottom := b.Max.Y
right := b.Max.X
    
// Accessing pixel. The (x,y) position must be
// started from (left, top) position not (0,0)
for y := top; y < bottom; y++ {
    for x := left; x < right; x++ {
        cl := img.At(x, y)
        r, g, b, a := cl.RGBA()
        // do something with r,g,b,a color component
    }
}

請注意,在包中,每個 R,G,B,A 元件的值介於 0-655350x0000 - 0xffff)之間,而不是 0-255