add video encoding. broken for now
This commit is contained in:
2
go.mod
2
go.mod
@@ -2,4 +2,4 @@ module code.uint32.ru/dmitry/barnsley-fern-go
|
|||||||
|
|
||||||
go 1.24.1
|
go 1.24.1
|
||||||
|
|
||||||
require github.com/AlexEidt/Vidio v1.5.1 // indirect
|
require github.com/AlexEidt/Vidio v1.5.1
|
||||||
|
4
image.go
4
image.go
@@ -8,7 +8,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
var erreEcnodePng = errors.New("не удалось создать png изображение")
|
var errEncodePng = errors.New("не удалось создать png изображение")
|
||||||
|
|
||||||
func createBarnsleyFernPng(s *settings, w io.Writer) error {
|
func createBarnsleyFernPng(s *settings, w io.Writer) error {
|
||||||
img := newImageWithBackGround(s.X, s.Y, s.BG)
|
img := newImageWithBackGround(s.X, s.Y, s.BG)
|
||||||
@@ -16,7 +16,7 @@ func createBarnsleyFernPng(s *settings, w io.Writer) error {
|
|||||||
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
|
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
|
||||||
|
|
||||||
if err := png.Encode(w, img); err != nil {
|
if err := png.Encode(w, img); err != nil {
|
||||||
return errors.Join(erreEcnodePng, err)
|
return errors.Join(errEncodePng, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
21
main.go
21
main.go
@@ -2,13 +2,26 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
filename, settings := parseSettings()
|
s := parseSettings()
|
||||||
|
|
||||||
file, err := os.Create(filename)
|
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 {
|
if err != nil {
|
||||||
fmt.Println("ошибка открытия файла", err)
|
fmt.Println("ошибка открытия файла", err)
|
||||||
return
|
return
|
||||||
@@ -20,8 +33,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err := createBarnsleyFernPng(settings, file); err != nil {
|
if err := processor(s, file); err != nil {
|
||||||
fmt.Println("ошибка создания изображения:", err)
|
fmt.Println("ошибка создания объекта:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
settings.go
10
settings.go
@@ -26,13 +26,16 @@ type settings struct {
|
|||||||
Dots int // dots to draw for single image
|
Dots int // dots to draw for single image
|
||||||
BG color.Color // background color
|
BG color.Color // background color
|
||||||
CM colormode // settings for colorFunc
|
CM colormode // settings for colorFunc
|
||||||
|
OM outputmode // what to output
|
||||||
|
Fname string // filename for output
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSettings() (string, *settings) {
|
func parseSettings() *settings {
|
||||||
var (
|
var (
|
||||||
x, y int
|
x, y int
|
||||||
dots int
|
dots int
|
||||||
cmode int
|
cmode int
|
||||||
|
output int
|
||||||
fname string
|
fname string
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -40,6 +43,7 @@ func parseSettings() (string, *settings) {
|
|||||||
flag.IntVar(&y, "y", 1080, "размер картинки по вертикали")
|
flag.IntVar(&y, "y", 1080, "размер картинки по вертикали")
|
||||||
flag.IntVar(&dots, "d", 100000, "сколько точек рисовать")
|
flag.IntVar(&dots, "d", 100000, "сколько точек рисовать")
|
||||||
flag.IntVar(&cmode, "color", 0, "color mode: 0 - default green, 1 - random, 2 - timed, 3 - rainbow")
|
flag.IntVar(&cmode, "color", 0, "color mode: 0 - default green, 1 - random, 2 - timed, 3 - rainbow")
|
||||||
|
flag.IntVar(&output, "o", 0, "режим вывода: 0 - изображение png, 1 - видео")
|
||||||
flag.StringVar(&fname, "out", "barnsley-fern.png", "полный путь файла для записи изображения")
|
flag.StringVar(&fname, "out", "barnsley-fern.png", "полный путь файла для записи изображения")
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@@ -50,7 +54,9 @@ func parseSettings() (string, *settings) {
|
|||||||
Dots: dots,
|
Dots: dots,
|
||||||
BG: color.White,
|
BG: color.White,
|
||||||
CM: colormode(cmode),
|
CM: colormode(cmode),
|
||||||
|
OM: outputmode(output),
|
||||||
|
Fname: fname,
|
||||||
}
|
}
|
||||||
|
|
||||||
return fname, s
|
return s
|
||||||
}
|
}
|
||||||
|
38
video.go
Normal file
38
video.go
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
vid "github.com/AlexEidt/Vidio"
|
||||||
|
)
|
||||||
|
|
||||||
|
var erreEncodeVideo = errors.New("не удалось создать видео")
|
||||||
|
|
||||||
|
func createBarnsLeyFernVideo(s *settings, w io.Writer) error {
|
||||||
|
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