|
|
|
package image
|
|
|
|
|
|
|
|
import (
|
|
|
|
"b612.me/staros"
|
|
|
|
"errors"
|
|
|
|
"image"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/golang/freetype"
|
|
|
|
|
|
|
|
"github.com/nfnt/resize"
|
|
|
|
|
|
|
|
"image/color"
|
|
|
|
"image/draw"
|
|
|
|
_ "image/gif"
|
|
|
|
_ "image/jpeg"
|
|
|
|
"image/png"
|
|
|
|
_ "image/png"
|
|
|
|
)
|
|
|
|
|
|
|
|
func OpenImage(name string) (image.Image, error) {
|
|
|
|
if !staros.Exists(name) {
|
|
|
|
return nil, errors.New("File Not Exists")
|
|
|
|
}
|
|
|
|
fso, err := os.Open(name)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
img, _, err := image.Decode(fso)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return img, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func MergePhoto(big, small image.Image, bigsize, smallsize uint, x, y int) image.Image {
|
|
|
|
big = resize.Resize(bigsize, bigsize, big, resize.Lanczos3)
|
|
|
|
small = resize.Resize(smallsize, smallsize, small, resize.Lanczos3)
|
|
|
|
offset := image.Pt(x, y)
|
|
|
|
b := big.Bounds()
|
|
|
|
nimg := image.NewRGBA(b)
|
|
|
|
draw.Draw(nimg, b, big, image.ZP, draw.Src)
|
|
|
|
draw.Draw(nimg, small.Bounds(), small, offset, draw.Over)
|
|
|
|
return nimg
|
|
|
|
}
|
|
|
|
|
|
|
|
func CompressPhoto(pho image.Image) image.Image {
|
|
|
|
//b := pho.Bounds()
|
|
|
|
return resize.Resize(0, 0, pho, resize.Bilinear)
|
|
|
|
}
|
|
|
|
|
|
|
|
func SavePhoto(path string, img image.Image) error {
|
|
|
|
imgf, err := os.Create(path)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer imgf.Close()
|
|
|
|
return png.Encode(imgf, img)
|
|
|
|
}
|
|
|
|
|
|
|
|
func SetAlpha(img image.Image, alpha uint8) image.Image {
|
|
|
|
size := img.Bounds()
|
|
|
|
nimg := image.NewRGBA(size)
|
|
|
|
for x := 0; x < size.Dx(); x++ {
|
|
|
|
for y := 0; y < size.Dy(); y++ {
|
|
|
|
r, g, b, a := img.At(x, y).RGBA()
|
|
|
|
r = r >> 8
|
|
|
|
g = g >> 8
|
|
|
|
b = b >> 8
|
|
|
|
a = a >> 8
|
|
|
|
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), alpha})
|
|
|
|
//nimg.Set(x, y, color.Alpha{alpha})
|
|
|
|
//nimg.Set(x, y, img.At(x, y))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nimg
|
|
|
|
}
|
|
|
|
|
|
|
|
func AddText(text string, img image.Image, x, y int, dpi, size float64, colors color.RGBA, ttf string) (image.Image, error) {
|
|
|
|
if !staros.Exists(ttf) {
|
|
|
|
return nil, errors.New("File Not Exists")
|
|
|
|
}
|
|
|
|
fontbyte, err := ioutil.ReadFile(ttf)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
font, err := freetype.ParseFont(fontbyte)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
nimg, ok := img.(draw.Image)
|
|
|
|
if !ok {
|
|
|
|
size := img.Bounds()
|
|
|
|
nimg = image.NewRGBA(img.Bounds())
|
|
|
|
for x := 0; x < size.Dx(); x++ {
|
|
|
|
for y := 0; y < size.Dy(); y++ {
|
|
|
|
r, g, b, a := img.At(x, y).RGBA()
|
|
|
|
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f := freetype.NewContext()
|
|
|
|
f.SetDPI(dpi)
|
|
|
|
f.SetFontSize(size)
|
|
|
|
f.SetFont(font)
|
|
|
|
f.SetClip(nimg.Bounds())
|
|
|
|
f.SetDst(nimg)
|
|
|
|
f.SetSrc(image.NewUniform(colors))
|
|
|
|
_, err = f.DrawString(text, freetype.Pt(x, y))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return nimg, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type TextImg struct {
|
|
|
|
Text string
|
|
|
|
X int
|
|
|
|
Y int
|
|
|
|
Dpi float64
|
|
|
|
Size float64
|
|
|
|
Color color.NRGBA
|
|
|
|
}
|
|
|
|
|
|
|
|
type TextList struct {
|
|
|
|
List []TextImg
|
|
|
|
TTF []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
func AddListTests(list TextList, img image.Image) (image.Image, error) {
|
|
|
|
font, err := freetype.ParseFont(list.TTF)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
nimg, ok := img.(draw.Image)
|
|
|
|
if !ok {
|
|
|
|
size := img.Bounds()
|
|
|
|
nimg = image.NewRGBA(img.Bounds())
|
|
|
|
for x := 0; x < size.Dx(); x++ {
|
|
|
|
for y := 0; y < size.Dy(); y++ {
|
|
|
|
r, g, b, a := img.At(x, y).RGBA()
|
|
|
|
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, v := range list.List {
|
|
|
|
f := freetype.NewContext()
|
|
|
|
f.SetDPI(v.Dpi)
|
|
|
|
f.SetFontSize(v.Size)
|
|
|
|
f.SetFont(font)
|
|
|
|
f.SetClip(nimg.Bounds())
|
|
|
|
f.SetDst(nimg)
|
|
|
|
f.SetSrc(image.NewUniform(v.Color))
|
|
|
|
_, err = f.DrawString(v.Text, freetype.Pt(v.X, v.Y))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nimg, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func AddTexts(text string, img image.Image, x, y int, dpi, size float64, colors color.NRGBA, ttf string) (image.Image, error) {
|
|
|
|
if !staros.Exists(ttf) {
|
|
|
|
return nil, errors.New("File Not Exists")
|
|
|
|
}
|
|
|
|
fontbyte, err := ioutil.ReadFile(ttf)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
font, err := freetype.ParseFont(fontbyte)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
nimg, ok := img.(draw.Image)
|
|
|
|
if !ok {
|
|
|
|
size := img.Bounds()
|
|
|
|
nimg = image.NewRGBA(img.Bounds())
|
|
|
|
for x := 0; x < size.Dx(); x++ {
|
|
|
|
for y := 0; y < size.Dy(); y++ {
|
|
|
|
r, g, b, a := img.At(x, y).RGBA()
|
|
|
|
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f := freetype.NewContext()
|
|
|
|
f.SetDPI(dpi)
|
|
|
|
f.SetFontSize(size)
|
|
|
|
f.SetFont(font)
|
|
|
|
f.SetClip(nimg.Bounds())
|
|
|
|
f.SetDst(nimg)
|
|
|
|
f.SetSrc(image.NewUniform(colors))
|
|
|
|
_, err = f.DrawString(text, freetype.Pt(x, y))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return nimg, nil
|
|
|
|
}
|