Files
imgo/util.go
2022-06-22 14:07:54 +08:00

83 lines
1.9 KiB
Go

package imgo
import (
"fmt"
"golang.org/x/image/bmp"
"golang.org/x/image/tiff"
"golang.org/x/image/webp"
"image"
"image/color"
"image/draw"
"image/jpeg"
"image/png"
"io"
)
// GetImageType returns the extension, mimetype and corresponding decoder function of the image.
// It judges the image by its first few bytes called magic number.
func GetImageType(bytes []byte) (ext string, mimetype string, decoder func(r io.Reader) (image.Image, error), err error) {
if len(bytes) < 2 {
err = ErrSourceImageNotSupport
return
}
if bytes[0] == 0xFF && bytes[1] == 0xD8 {
ext = "jpg"
mimetype = "image/jpeg"
decoder = jpeg.Decode
}
if len(bytes) >= 4 && bytes[0] == 0x89 && bytes[1] == 0x50 && bytes[2] == 0x4E && bytes[3] == 0x47 {
ext = "png"
mimetype = "image/png"
decoder = png.Decode
}
if bytes[0] == 0x42 && bytes[1] == 0x4D {
ext = "bmp"
mimetype = "image/x-ms-bmp"
decoder = bmp.Decode
}
if (bytes[0] == 0x49 && bytes[1] == 0x49) || (bytes[0] == 0x4D && bytes[1] == 0x4D) {
ext = "tiff"
mimetype = "image/tiff"
decoder = tiff.Decode
}
if bytes[0] == 0x52 && bytes[1] == 0x49 {
ext = "webp"
mimetype = "image/webp"
decoder = webp.Decode
}
/*if bytes[0] == 0x47 && bytes[1] == 0x49 && bytes[2] == 0x46 && bytes[3] == 0x38 {
ext = "gif"
mimetype = "image/gif"
}
if bytes[0] == 0x00 && bytes[1] == 0x00 && (bytes[2] == 0x01 || bytes[2] == 0x02) && bytes[3] == 0x00 {
ext = "ico"
mimetype = "image/x-icon"
}*/
if ext == "" {
err = ErrSourceImageNotSupport
}
return
}
// Color2Hex converts a color.Color to its hex string representation.
func Color2Hex(c color.Color) string {
r, g, b, _ := c.RGBA()
return fmt.Sprintf("#%02X%02X%02X", uint8(r>>8), uint8(g>>8), uint8(b>>8))
}
// Image2RGBA converts an image to RGBA.
func Image2RGBA(img image.Image) *image.RGBA {
rgba := image.NewRGBA(img.Bounds())
draw.Draw(rgba, rgba.Bounds(), img, img.Bounds().Min, draw.Over)
return rgba
}