From 71b95dbfae0a6a44d11c2bc0138edc57e3cae3d6 Mon Sep 17 00:00:00 2001 From: Dmitry Fedotov Date: Thu, 27 Mar 2025 22:04:21 +0300 Subject: [PATCH] png and jpeg gen, refactoring --- image.go | 15 +++++++++++---- main.go | 36 ++++++++++++++++-------------------- settings.go | 3 +-- video.go | 40 ---------------------------------------- 4 files changed, 28 insertions(+), 66 deletions(-) delete mode 100644 video.go diff --git a/image.go b/image.go index 7ed023f..0932fbd 100644 --- a/image.go +++ b/image.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "image" "image/color" "image/jpeg" @@ -9,9 +10,12 @@ import ( "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) drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots) @@ -22,13 +26,16 @@ func createBarnsleyFernPng(s *settings, w io.Writer) error { Quality: 100, } if err := jpeg.Encode(w, img, opts); err != nil { - return errors.Join(errEncodePng, err) + return errors.Join(errEncodeImage, err) } case outputpng: 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 diff --git a/main.go b/main.go index 10de3e8..a2f887a 100644 --- a/main.go +++ b/main.go @@ -2,41 +2,37 @@ package main import ( "fmt" - "io" "os" ) func main() { + exitCode := run() + os.Exit(exitCode) +} + +func run() int { s := parseSettings() - var processor func(*settings, io.Writer) error - - switch s.OM { - case outputpng: - processor = createBarnsleyFernPng - case outputvideo: - processor = createBarnsLeyFernVideo - default: - fmt.Println("неизвестный тип вывода:", s.OM) - return - } - file, err := os.Create(s.Fname) if err != nil { fmt.Println("ошибка открытия файла", err) - return + return 1 } defer func() { - if err := file.Close(); err != nil { - fmt.Println("ошибка закрытия файла", err) - } }() - if err := processor(s, file); err != nil { - fmt.Println("ошибка создания объекта:", err) - return + if err := createBarnsleyFernImage(s, file); err != nil { + fmt.Println("ошибка создания изображения:", err) + return 2 + } + + if err := file.Close(); err != nil { + fmt.Println("ошибка закрытия файла:", err) + return 3 } fmt.Println("done...") + + return 0 } diff --git a/settings.go b/settings.go index a0b9b9e..6b5646f 100644 --- a/settings.go +++ b/settings.go @@ -20,7 +20,6 @@ type outputmode int const ( outputpng outputmode = iota outputjpeg - outputvideo ) type settings struct { @@ -45,7 +44,7 @@ func parseSettings() *settings { flag.IntVar(&y, "y", 1080, "размер картинки по вертикали") flag.IntVar(&dots, "d", 100000, "сколько точек рисовать") 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.Parse() diff --git a/video.go b/video.go deleted file mode 100644 index 2967974..0000000 --- a/video.go +++ /dev/null @@ -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 -}