add jpeg generation, refactor

This commit is contained in:
2025-03-27 22:09:43 +03:00
committed by Dmitry Fedotov
parent 878e3d7c05
commit 50cb1ec26c
6 changed files with 220 additions and 103 deletions

68
image.go Normal file
View File

@@ -0,0 +1,68 @@
package main
import (
"errors"
"fmt"
"image"
"image/color"
"image/jpeg"
"image/png"
"io"
)
var (
errEncodeImage = errors.New("не удалось создать изображение")
errUnknownFormat = errors.New("неизвестный формат изображения")
)
func createBarnsleyFernImage(s *settings, w io.Writer) error {
img := newImageWithBackGround(s.X, s.Y, s.BG)
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
switch s.OM {
case outputjpeg:
opts := &jpeg.Options{
Quality: 100,
}
if err := jpeg.Encode(w, img, opts); err != nil {
return errors.Join(errEncodeImage, err)
}
case outputpng:
if err := png.Encode(w, img); err != nil {
return errors.Join(errEncodeImage, err)
}
default:
return fmt.Errorf("%w: %d", s.OM)
}
return nil
}
func newImageWithBackGround(x, y int, background color.Color) *image.RGBA {
img := createImage(x, y)
fillBackground(img, background)
return img
}
func createImage(x, y int) *image.RGBA {
rect := image.Rectangle{
image.Point{0, 0},
image.Point{x, y},
}
return image.NewRGBA(rect)
}
func fillBackground(img *image.RGBA, c color.Color) {
rect := img.Bounds()
for x := range rect.Max.X {
for y := range rect.Max.Y {
img.Set(x, y, c)
}
}
}