Files
barnsley-fern-go/image.go

69 lines
1.2 KiB
Go
Raw Normal View History

2025-03-25 23:55:13 +03:00
package main
import (
"errors"
2025-03-27 22:04:21 +03:00
"fmt"
2025-03-25 23:55:13 +03:00
"image"
"image/color"
2025-03-26 22:11:52 +03:00
"image/jpeg"
2025-03-25 23:55:13 +03:00
"image/png"
"io"
)
2025-03-27 22:04:21 +03:00
var (
errEncodeImage = errors.New("не удалось создать изображение")
errUnknownFormat = errors.New("неизвестный формат изображения")
)
2025-03-25 23:55:13 +03:00
2025-03-27 22:04:21 +03:00
func createBarnsleyFernImage(s *settings, w io.Writer) error {
2025-03-25 23:55:13 +03:00
img := newImageWithBackGround(s.X, s.Y, s.BG)
drawBarnsleyFern(img, newColorFunc(s.CM), s.Dots)
2025-03-26 22:11:52 +03:00
switch s.OM {
case outputjpeg:
opts := &jpeg.Options{
Quality: 100,
}
if err := jpeg.Encode(w, img, opts); err != nil {
2025-03-27 22:04:21 +03:00
return errors.Join(errEncodeImage, err)
2025-03-26 22:11:52 +03:00
}
case outputpng:
if err := png.Encode(w, img); err != nil {
2025-03-27 22:04:21 +03:00
return errors.Join(errEncodeImage, err)
2025-03-26 22:11:52 +03:00
}
2025-03-27 22:04:21 +03:00
default:
return fmt.Errorf("%w: %d", s.OM)
2025-03-25 23:55:13 +03:00
}
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)
}
}
}