cpp

Функция DrawMask()

Метод DrawMask() из пакета image/draw позволяет скопировать фрагмент с одного изображения и наложить его на другое изображение с учетом маски. Формат функции:

draw.DrawMask(dst draw.Image, r image.Rectangle, src image.Image,
              sp image.Point, mask image.Image, mp image.Point,
              op draw.Op)

В параметре dst указывается изображение, на которое будут скопирован фрагмент из изображения src. Координаты места вставки скопированного фрагмента в изображение dst задаются во втором параметре. Координаты начала копируемого фрагмента на изображении src задаются параметром sp. Параметр op задает режим наложения в виде константы Over или Src:

type Op int
const draw.Over draw.Op = 0
const draw.Src draw.Op = 1
(draw.Op).Draw(dst draw.Image, r image.Rectangle,
               src image.Image, sp image.Point)

В параметре mask указывается изображение с маской, а в параметре mp — координаты начала фрагмента на маске.

Пример использования функции DrawMask() приведен в листинге 17.13.

Листинг 17.13. Функция DrawMask()

package main

import (
   "fmt"
   "image"
   "image/color"
   "image/draw"
   "image/jpeg"
   "os"
)

func main() {
   // Загружаем изображение из файла
   file, err := os.Open(`C:\book\photo.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   src, err := jpeg.Decode(file)
   if err != nil {
      fmt.Println(err)
      return
   }
   // Создаем новое изображение
   dst := image.NewNRGBA(image.Rect(0, 0, 300, 300))
   // Закрашиваем все изображение черным цветом
   draw.Draw(dst, dst.Bounds(), image.Black, image.Point{}, draw.Src)
   // Создаем маску круглой формы
   mask := image.NewAlpha(image.Rect(0, 0, 200, 200))
   for y, my := mask.Bounds().Min.Y, mask.Bounds().Max.Y; y < my; y++ {
      for x, mx := mask.Bounds().Min.X,mask.Bounds().Max.X;x < mx;x++ {
         xx := float64(x - 100) + 0.5
         yy := float64(y - 100) + 0.5
         rr := float64(100)
         if xx * xx + yy * yy < rr * rr {
            mask.SetAlpha(x, y, color.Alpha{255})
         } else {
            mask.SetAlpha(x, y, color.Alpha{0})
         }
      }
   }
   // Копируем фрагмент
   r := image.Rect(10, 10, 210, 210)
   draw.DrawMask(dst, r, src, image.Point{100, 100},
                 mask, image.Point{}, draw.Over)
   // Сохраняем изображение в файл
   file2, err := os.Create(`C:\book\img.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file2.Close()
   err = jpeg.Encode(file2, dst, &jpeg.Options{Quality: 75})
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

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

Реквизиты

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

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

cpp