coai/utils/image.go
2023-11-21 21:58:44 +08:00

64 lines
1.2 KiB
Go

package utils
import (
"chat/globals"
"image"
"math"
"net/http"
)
type Image struct {
Object image.Image
}
type Images []Image
func NewImage(url string) (*Image, error) {
res, err := http.Get(url)
if err != nil {
return nil, err
}
defer res.Body.Close()
img, _, err := image.Decode(res.Body)
if err != nil {
return nil, err
}
return &Image{Object: img}, nil
}
func (i *Image) GetWidth() int {
return i.Object.Bounds().Max.X
}
func (i *Image) GetHeight() int {
return i.Object.Bounds().Max.Y
}
func (i *Image) GetPixel(x int, y int) (uint32, uint32, uint32, uint32) {
return i.Object.At(x, y).RGBA()
}
func (i *Image) GetPixelColor(x int, y int) (int, int, int) {
r, g, b, _ := i.GetPixel(x, y)
return int(r), int(g), int(b)
}
func (i *Image) CountTokens(model string) int {
switch model {
case globals.GPT41106VisionPreview:
// tile size is 512x512
// the max size of image is 2048x2048
// the image that is larger than 2048x2048 will be resized in 16 tiles
x := LimitMax(math.Ceil(float64(i.GetWidth())/512), 4)
y := LimitMax(math.Ceil(float64(i.GetHeight())/512), 4)
tiles := int(x) * int(y)
return 85 + 170*tiles
default:
return 0
}
}