cpp

Создание изображения. Формат NRGBA

Создать изображение в формате NRGBA (цветовая модель color.NRGBAModel) позволяет функция NewNRGBA() из пакета image. Формат функции:

image.NewNRGBA(r image.Rectangle) *image.NRGBA

Пример:

img := image.NewRGBA(image.Rect(0, 0, 100, 100))

Определение структуры image.NRGBA:

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

Поле Pix содержит слайс с пикселами в порядке R, G, B, A. Поле Stride позволяет получить шаг в байтах между соседними пикселами по вертикали (размер строки). С помощью поля Rect можно определить границы изображения. Закрасим изображение красным цветом:

fmt.Println(img.Stride)                   // 400
fmt.Println(img.Rect.Dx(), img.Rect.Dy()) // 100 100
for y, my := img.Rect.Min.Y, img.Rect.Max.Y; y < my; y++ {
   for x, mx := img.Rect.Min.X, img.Rect.Max.X; x < mx; x++ {
      index := (y-img.Rect.Min.Y)*img.Stride + (x-img.Rect.Min.X)*4
      // index := img.PixOffset(x, y)
      img.Pix[index + 0] = 255
      img.Pix[index + 1] = 0
      img.Pix[index + 2] = 0
      img.Pix[index + 3] = 255
   }
}

Структура image.NRGBA содержит следующие методы:

  • ColorModel() — возвращает цветовую модель. Формат метода:
(*image.NRGBA).ColorModel() color.Model

Пример:

fmt.Println(img.ColorModel() == color.NRGBAModel) // true
  • Bounds() — возвращает координаты прямоугольной области. Формат метода:
(*image.NRGBA).Bounds() image.Rectangle

Пример:

fmt.Println(img.Bounds()) // (0,0)-(100,100)
  • At() — возвращает информацию о цвете точки с указанными координатами. Формат метода:
(*image.NRGBA).At(x int, y int) color.Color

Пример:

fmt.Println(img.At(0, 0).RGBA()) // 65535 0 0 65535
  • NRGBAAt() — возвращает информацию о цвете точки с указанными координатами. Формат метода:
(*image.NRGBA).NRGBAAt(x int, y int) color.NRGBA

Пример:

fmt.Println(img.NRGBAAt(0, 0).RGBA()) // 65535 0 0 65535
  • RGBA64At() — возвращает информацию о цвете точки с указанными координатами. Формат метода:
(*image.NRGBA).RGBA64At(x int, y int) color.RGBA64

Пример:

fmt.Println(img.RGBA64At(0, 0).RGBA()) // 65535 0 0 65535
  • Set() — задает цвет точки с указанными координатами. Формат метода:
(*image.NRGBA).Set(x int, y int, c color.Color)

Пример:

img.Set(x, y, color.NRGBA{0, 0, 255, 255})
  • SetNRGBA() — задает цвет точки с указанными координатами. Формат метода:
(*image.NRGBA).SetNRGBA(x int, y int, c color.NRGBA)

Пример:

img.SetNRGBA(x, y, color.NRGBA{0, 0, 255, 255})
  • SetRGBA64() — задает цвет точки с указанными координатами. Формат метода:
(*image.NRGBA).SetRGBA64(x int, y int, c color.RGBA64)

Пример:

img.SetRGBA64(x, y, color.RGBA64{0, 0, 65535, 65535})
  • PixOffset() — возвращает смещение внутри слайса из поля Pix для точки с указанными координатами. Формат метода:
(*image.NRGBA).PixOffset(x int, y int) int

Пример:

fmt.Println(img.PixOffset(10, 10)) // 4040
  • Opaque() — возвращает true, если изображение является полностью непрозрачным, и false — в противном случае. Формат метода:
(*image.NRGBA).Opaque() bool

Пример:

fmt.Println(img.Opaque())  // true
img2 := image.NewNRGBA(image.Rect(0, 0, 100, 100))
fmt.Println(img2.Opaque()) // false
  • SubImage() — возвращает фрагмент изображения. Формат метода:
(*image.NRGBA).SubImage(r image.Rectangle) image.Image

Пример:

im := img.SubImage(image.Rect(0, 0, 50, 50))

Создадим изображение формата NRGBA, закрасим его синим цветом, а затем сохраним его в файл в формате PNG (листинг 17.10).

Листинг 17.10. Создание изображения в формате NRGBA

package main

import (
   "fmt"
   "image"
   "image/color"
   "image/png"
   "os"
)

func main() {
   img := image.NewNRGBA(image.Rect(0, 0, 100, 100))
   for y, my := img.Bounds().Min.Y, img.Bounds().Max.Y; y < my; y++ {
      for x, mx := img.Bounds().Min.X, img.Bounds().Max.X; x < mx; x++ {
         img.SetNRGBA(x, y, color.NRGBA{0, 0, 255, 255})
      }
   }
   file, err := os.Create(`C:\book\img.png`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   err = png.Encode(file, img)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp