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 }