add jpeg generation, refactor #2

Merged
dmitry merged 7 commits from videofern into main 2025-03-27 22:09:45 +03:00
4 changed files with 28 additions and 66 deletions
Showing only changes of commit 71b95dbfae - Show all commits

View File

@@ -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
View File

@@ -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
} }

View File

@@ -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()

View File

@@ -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
}