cpp

Функция Draw()

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

draw.Draw(dst draw.Image, r image.Rectangle, src image.Image,
          sp 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)

Закрасим все изображение серым цветом:

gray := image.NewUniform(color.RGBA{128, 128, 128, 255})
dst := image.NewNRGBA(image.Rect(0, 0, 300, 300))
draw.Draw(dst, dst.Bounds(), gray, image.Point{}, draw.Src)

Для заливки можно воспользоваться уже готовыми изображениями:

var image.Black *image.Uniform
var image.White *image.Uniform
var image.Transparent *image.Uniform
var image.Opaque *image.Uniform

Закрасим все изображение черным цветом:

dst := image.NewNRGBA(image.Rect(0, 0, 300, 300))
draw.Draw(dst, dst.Bounds(), image.Black, image.Point{}, draw.Src)

Преобразуем изображение формата JPEG в изображение формата RGBA:

// src, err := jpeg.Decode(file)
rSrc := image.Rect(0, 0, src.Bounds().Dx(), src.Bounds().Dy())
rgba := image.NewRGBA(rSrc)
draw.Draw(rgba, rgba.Bounds(), src, src.Bounds().Min, draw.Src)

Загрузим изображение из файла, создадим новое изображение и закрасим его черным цветом, затем скопируем фрагмент и сохраним изображение в файл (листинг 17.12).

Листинг 17.12. Функция Draw()

package main

import (
   "fmt"
   "image"
   "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)
   // Копируем фрагмент
   r := image.Rect(10, 10, 210, 210)
   draw.Draw(dst, r, src, image.Point{100, 100}, draw.Src)
   // Сохраняем изображение в файл
   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