func (e *ThumbnailEncoder) GetThumbnail(img *models.Image, maxSize int) ([]byte, error) {
	reader, err := openSourceImage(img.Path)
	if err != nil {
		return nil, err
	}

	buf := new(bytes.Buffer)
	if _, err := buf.ReadFrom(reader); err != nil {
		return nil, err
	}

	data := buf.Bytes()

	// use NewBufferString to copy the buffer, rather than reuse it
	_, format, err := image.DecodeConfig(bytes.NewBufferString(string(data)))
	if err != nil {
		return nil, err
	}

	animated := format == formatGif

	// #2266 - if image is webp, then determine if it is animated
	if format == formatWebP {
		animated = isWebPAnimated(data)
	}

	// #2266 - don't generate a thumbnail for animated images
	if animated {
		return nil, fmt.Errorf("%w: %s", ErrNotSupportedForThumbnail, format)
	}

	// vips has issues loading files from stdin on Windows
	if e.vips != nil && runtime.GOOS != "windows" {
		return e.vips.ImageThumbnail(buf, maxSize)
	} else {
		return e.ffmpegImageThumbnail(buf, format, maxSize)
	}
}
// GetThumbnail returns the thumbnail image of the provided image resized to
// the provided max size. It resizes based on the largest X/Y direction.
// It returns nil and an error if an error occurs reading, decoding or encoding
// the image, or if the image is not suitable for thumbnails.
GetThumbnail returns the thumbnail image of the provided image resized to
the provided max size. It resizes based on the largest X/Y direction.
It returns nil and an error if an error occurs reading, decoding or encoding
the image, or if the image is not suitable for thumbnails.
// GetThumbnail returns the thumbnail image of the provided image resized to // the provided max size . It resizes based on the largest X / Y direction . // It returns nil and an error if an error occurs reading decoding or encoding // the image or if the image is not suitable for thumbnails .
func (e *ThumbnailEncoder) GetThumbnail(img *models.Image, maxSize int) ([]byte, error) {
	reader, err := openSourceImage(img.Path)
	if err != nil {
		return nil, err
	}
	buf := new(bytes.Buffer)
	if _, err := buf.ReadFrom(reader); err != nil {
		return nil, err
	}
	data := buf.Bytes()
	_, format, err := image.DecodeConfig(bytes.NewBufferString(string(data)))
	if err != nil {
		return nil, err
	}
	animated := format == formatGif
	if format == formatWebP {
		animated = isWebPAnimated(data)
	}
	if animated {
		return nil, fmt.Errorf("%w: %s", ErrNotSupportedForThumbnail, format)
	}
	if e.vips != nil && runtime.GOOS != "windows" {
		return e.vips.ImageThumbnail(buf, maxSize)
	} else {
		return e.ffmpegImageThumbnail(buf, format, maxSize)
	}
}
func ( e * ThumbnailEncoder ) GetThumbnail ( img * models . Image , maxSize int ) ( [ ] byte , error ) { reader , err := openSourceImage ( img . Path ) if err != nil { return nil , err } buf := new ( bytes . Buffer ) if _ , err := buf . ReadFrom ( reader ) ; err != nil { return nil , err } data := buf . Bytes ( ) _ , format , err := image . DecodeConfig ( bytes . NewBufferString ( string ( data ) ) ) if err != nil { return nil , err } animated := format == formatGif if format == formatWebP { animated = isWebPAnimated ( data ) } if animated { return nil , fmt . Errorf ( " " , ErrNotSupportedForThumbnail , format ) } if e . vips != nil && runtime . GOOS != " " { return e . vips . ImageThumbnail ( buf , maxSize ) } else { return e . ffmpegImageThumbnail ( buf , format , maxSize ) } }
GetThumbnail returns the thumbnail image of the provided image resized to
the provided max size.
GetThumbnail returns the thumbnail image of the provided image resized to the provided max size .
// use NewBufferString to copy the buffer, rather than reuse it // #2266 - if image is webp, then determine if it is animated // #2266 - don't generate a thumbnail for animated images // vips has issues loading files from stdin on Windows