png and jpeg gen, refactoring
This commit is contained in:
15
image.go
15
image.go
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
@@ -9,9 +10,12 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errEncodePng = errors.New("не удалось создать png изображение")
|
var (
|
||||||
|
errEncodeImage = errors.New("не удалось создать изображение")
|
||||||
|
errUnknownFormat = errors.New("неизвестный формат изображения")
|
||||||
|
)
|
||||||
|
|
||||||
func createBarnsleyFernPng(s *settings, w io.Writer) error {
|
func createBarnsleyFernImage(s *settings, w io.Writer) error {
|
||||||
img := newImageWithBackGround(s.X, s.Y, s.BG)
|
img := newImageWithBackGround(s.X, s.Y, s.BG)
|
||||||
|
|
||||||
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
|
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
|
||||||
@@ -22,13 +26,16 @@ func createBarnsleyFernPng(s *settings, w io.Writer) error {
|
|||||||
Quality: 100,
|
Quality: 100,
|
||||||
}
|
}
|
||||||
if err := jpeg.Encode(w, img, opts); err != nil {
|
if err := jpeg.Encode(w, img, opts); err != nil {
|
||||||
return errors.Join(errEncodePng, err)
|
return errors.Join(errEncodeImage, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
case outputpng:
|
case outputpng:
|
||||||
if err := png.Encode(w, img); err != nil {
|
if err := png.Encode(w, img); err != nil {
|
||||||
return errors.Join(errEncodePng, err)
|
return errors.Join(errEncodeImage, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("%w: %d", s.OM)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
36
main.go
36
main.go
@@ -2,41 +2,37 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := parseSettings()
|
exitCode := run()
|
||||||
|
os.Exit(exitCode)
|
||||||
var processor func(*settings, io.Writer) error
|
|
||||||
|
|
||||||
switch s.OM {
|
|
||||||
case outputpng:
|
|
||||||
processor = createBarnsleyFernPng
|
|
||||||
case outputvideo:
|
|
||||||
processor = createBarnsLeyFernVideo
|
|
||||||
default:
|
|
||||||
fmt.Println("неизвестный тип вывода:", s.OM)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func run() int {
|
||||||
|
s := parseSettings()
|
||||||
|
|
||||||
file, err := os.Create(s.Fname)
|
file, err := os.Create(s.Fname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("ошибка открытия файла", err)
|
fmt.Println("ошибка открытия файла", err)
|
||||||
return
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := file.Close(); err != nil {
|
|
||||||
fmt.Println("ошибка закрытия файла", err)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err := processor(s, file); err != nil {
|
if err := createBarnsleyFernImage(s, file); err != nil {
|
||||||
fmt.Println("ошибка создания объекта:", err)
|
fmt.Println("ошибка создания изображения:", err)
|
||||||
return
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := file.Close(); err != nil {
|
||||||
|
fmt.Println("ошибка закрытия файла:", err)
|
||||||
|
return 3
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("done...")
|
fmt.Println("done...")
|
||||||
|
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,6 @@ type outputmode int
|
|||||||
const (
|
const (
|
||||||
outputpng outputmode = iota
|
outputpng outputmode = iota
|
||||||
outputjpeg
|
outputjpeg
|
||||||
outputvideo
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type settings struct {
|
type settings struct {
|
||||||
@@ -45,7 +44,7 @@ func parseSettings() *settings {
|
|||||||
flag.IntVar(&y, "y", 1080, "размер картинки по вертикали")
|
flag.IntVar(&y, "y", 1080, "размер картинки по вертикали")
|
||||||
flag.IntVar(&dots, "d", 100000, "сколько точек рисовать")
|
flag.IntVar(&dots, "d", 100000, "сколько точек рисовать")
|
||||||
flag.IntVar(&cmode, "c", 0, "color mode: 0 - default green, 1 - random, 2 - timed, 3 - rainbow")
|
flag.IntVar(&cmode, "c", 0, "color mode: 0 - default green, 1 - random, 2 - timed, 3 - rainbow")
|
||||||
flag.IntVar(&output, "o", 0, fmt.Sprintf("режим вывода: %d - png, %d - jpeg, %d - видео", outputpng, outputjpeg, outputvideo))
|
flag.IntVar(&output, "o", 0, fmt.Sprintf("режим вывода: %d - png, %d - jpeg", outputpng, outputjpeg))
|
||||||
flag.StringVar(&fname, "out", "barnsley-fern.png", "полный путь файла для записи изображения")
|
flag.StringVar(&fname, "out", "barnsley-fern.png", "полный путь файла для записи изображения")
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
40
video.go
40
video.go
@@ -1,40 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"errors"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
vid "github.com/AlexEidt/Vidio"
|
|
||||||
)
|
|
||||||
|
|
||||||
var erreEncodeVideo = errors.New("не удалось создать видео")
|
|
||||||
|
|
||||||
func createBarnsLeyFernVideo(s *settings, w io.Writer) error {
|
|
||||||
s.OM = outputjpeg
|
|
||||||
|
|
||||||
opts := &vid.Options{
|
|
||||||
FPS: 1,
|
|
||||||
Quality: 0,
|
|
||||||
Delay: 1000,
|
|
||||||
}
|
|
||||||
|
|
||||||
vw, err := vid.NewVideoWriter(s.Fname, s.X, s.Y, opts)
|
|
||||||
if err != nil {
|
|
||||||
return errors.Join(erreEncodeVideo, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
frames := 100
|
|
||||||
for range frames {
|
|
||||||
imgbuf := new(bytes.Buffer)
|
|
||||||
if err := createBarnsleyFernPng(s, imgbuf); err != nil {
|
|
||||||
return errors.Join(erreEncodeVideo, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := vw.Write(imgbuf.Bytes()); err != nil {
|
|
||||||
return errors.Join(erreEncodeVideo, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
Reference in New Issue
Block a user