parent
874012fe56
commit
4b69d2b8bf
@ -0,0 +1,194 @@
|
|||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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"
|
||||||
|
|
||||||
|
"b612.me/starainrt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func OpenImage(name string) (image.Image, error) {
|
||||||
|
if !starainrt.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 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 !starainrt.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 !starainrt.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
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"image"
|
||||||
|
|
||||||
|
"b612.me/starlog"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
imageCmd.AddCommand(imgMirrorCmd)
|
||||||
|
Maincmd.AddCommand(imageCmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
var imageCmd = &cobra.Command{
|
||||||
|
Use: "image",
|
||||||
|
Short: "图像处理",
|
||||||
|
Long: "简单的图像处理工具",
|
||||||
|
Run: func(this *cobra.Command, args []string) {
|
||||||
|
this.Help()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var imgMirrorCmd = &cobra.Command{
|
||||||
|
Use: "mirror",
|
||||||
|
Short: "图像镜像翻转",
|
||||||
|
Long: "图像镜像翻转<水平>",
|
||||||
|
Run: func(this *cobra.Command, args []string) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, "请指定需要转换的图像!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, v := range args {
|
||||||
|
img, err := OpenImage(v)
|
||||||
|
if err != nil {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, err, v)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
size := img.Bounds()
|
||||||
|
nimg := image.NewRGBA(size)
|
||||||
|
for x := 0; x < size.Dx(); x++ {
|
||||||
|
for y := 0; y < size.Dy(); y++ {
|
||||||
|
nimg.Set(size.Dx()-x, y, img.At(x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := SavePhoto(v, nimg); err != nil {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, err, v)
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
fmt.Println(v, "转换已完成!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("任务完成!")
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var imgAlpha = &cobra.Command{
|
||||||
|
Use: "alpha",
|
||||||
|
Short: "设置透明度",
|
||||||
|
Long: "设置alpha通道透明度",
|
||||||
|
Run: func(this *cobra.Command, args []string) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, "请指定需要转换的图像!")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, v := range args {
|
||||||
|
img, err := OpenImage(v)
|
||||||
|
if err != nil {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, err, v)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
img = SetAlpha(img, 4)
|
||||||
|
if err := SavePhoto(v, img); err != nil {
|
||||||
|
starlog.StdPrintln(0, starlog.RED, err, v)
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
fmt.Println(v, "转换已完成!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("任务完成!")
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in New Issue