cpp

Сохранение изображения в файл

Язык Go позволяет сохранить изображения в форматах JPEG, PNG и GIF.

Формат JPEG

Сохранить изображение в файл в формате JPEG позволяет функция Encode() из пакета image/jpeg. Формат функции:

jpeg.Encode(w io.Writer, m image.Image, o *jpeg.Options) error

В первом параметре указывается поток вывода, например, файл открытый для записи. Во втором параметре передается объект изображения. В третьем параметре можно указать качество изображения в виде указателя на объект структуры Options:

type Options struct {
   Quality int
}

Поле Quality может содержать значение от 1 до 100. Если в третьем параметре указано nil, то качество будет равно 75. Функция возвращает объект ошибки или nil, если операция выполнена успешно.

Загрузим изображение формата PNG из файла, а затем сохраним его в файл в формате JPEG с максимальным качеством (листинг 17.5).

Листинг 17.5. Сохранение изображения в файл в формате JPEG

package main

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

func main() {
   file, err := os.Open(`C:\book\photo.png`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   img, err := png.Decode(file)
   if err != nil {
      fmt.Println(err)
      return
   }
   file2, err := os.Create(`C:\book\img.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file2.Close()
   err = jpeg.Encode(file2, img, &jpeg.Options{Quality: 100})
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

Формат PNG

Сохранить изображение в файл в формате PNG позволяет функция Encode() из пакета image/png. Формат функции:

png.Encode(w io.Writer, m image.Image) error

В первом параметре указывается поток вывода, например, файл открытый для записи. Во втором параметре передается объект изображения. Функция возвращает объект ошибки или nil, если операция выполнена успешно.

Загрузим изображение формата JPEG из файла, а затем сохраним его в файл в формате PNG (листинг 17.6).

Листинг 17.6. Сохранение изображения в файл в формате PNG

package main

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

func main() {
   file, err := os.Open(`C:\book\photo.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   img, err := jpeg.Decode(file)
   if err != nil {
      fmt.Println(err)
      return
   }
   file2, err := os.Create(`C:\book\img.png`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file2.Close()
   err = png.Encode(file2, img)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

Если нужно задать степень сжатия, то следует создать объект структуры Encoder:

type Encoder struct {
   CompressionLevel CompressionLevel
   BufferPool EncoderBufferPool
}

В качестве значения поля CompressionLevel можно указать следующие константы:

png.DefaultCompression
png.NoCompression
png.BestSpeed
png.BestCompression

Запись в файл производится с помощью метода Encode():

(*png.Encoder).Encode(w io.Writer, m image.Image) error

Загрузим изображение формата JPEG из файла, а затем сохраним его в файл в формате PNG, указав степень сжатия (листинг 17.7).

Листинг 17.7. Сохранение изображения в файл в формате PNG

package main

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

func main() {
   file, err := os.Open(`C:\book\photo.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   img, err := jpeg.Decode(file)
   if err != nil {
      fmt.Println(err)
      return
   }
   file2, err := os.Create(`C:\book\img.png`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file2.Close()
   enc := png.Encoder{CompressionLevel: png.BestCompression}
   err = enc.Encode(file2, img)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

Формат GIF

Сохранить изображение в файл в формате GIF позволяет функция Encode() из пакета image/gif. Формат функции:

gif.Encode(w io.Writer, m image.Image, o *gif.Options) error

В первом параметре указывается поток вывода, например, файл открытый для записи. Во втором параметре передается объект изображения. В третьем параметре можно указать настройки в виде указателя на объект структуры Options:

type Options struct {
   NumColors int
   Quantizer draw.Quantizer
   Drawer draw.Drawer
}

Функция возвращает объект ошибки или nil, если операция выполнена успешно.

Файлы в формате GIF могут содержать сразу несколько изображений. Сохранить в файл сразу несколько изображений позволяет функция EncodeAll() из пакета image/gif. Формат функции:

gif.EncodeAll(w io.Writer, g *gif.GIF) error

Загрузим изображение формата JPEG из файла, а затем сохраним его в файл в формате GIF (листинг 17.8).

Листинг 17.8. Сохранение изображения в файл в формате GIF

package main

import (
   "fmt"
   "image/gif"
   "image/jpeg"
   "os"
)

func main() {
   file, err := os.Open(`C:\book\photo.jpg`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file.Close()
   img, err := jpeg.Decode(file)
   if err != nil {
      fmt.Println(err)
      return
   }
   file2, err := os.Create(`C:\book\img.gif`)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer file2.Close()
   err = gif.Encode(file2, img, &gif.Options{NumColors: 256})
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println("Операция выполнена успешно")
}

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

Помощь сайту

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

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

cpp