Go Concepts de base


Exemple

Une image représente une grille rectangulaire d'éléments d'image ( pixel ). Dans le package d' image , le pixel est représenté comme l'une des couleurs définies dans le package image / couleur . La géométrie 2D de l'image est représentée sous la forme image.Rectangle , tandis que image.Point indique une position sur la grille.

Image et géométrie 2D

La figure ci-dessus illustre les concepts de base d'une image dans le package. Une image de taille 15x14 pixels a des limites rectangulaires au coin supérieur gauche (par exemple, coordonnée (-3, -4) dans la figure ci-dessus), et ses axes augmentent vers le bas et le coin droit (par exemple, coordonnée ( 12, 10) sur la figure). Notez que les limites ne partent pas nécessairement du point (0,0) .

Type lié à l'image

Dans Go , une image implémente toujours l'interface suivante 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
}

dans lequel l'interface color.Color est définie comme

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)
}

et color.Model est une interface déclarée comme

type Model interface {
    Convert(c Color) Color
}

Accéder à la dimension de l'image et au pixel

Supposons que nous ayons une image stockée en tant que variable img , alors nous pouvons obtenir la dimension et l'image en pixel par:

// 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
    }
}

Notez que dans le package, la valeur de chaque composant R,G,B,A est comprise entre 0-65535 ( 0x0000 - 0xffff ) et non 0-255 .