mirror of
https://github.com/fumiama/imago.git
synced 2026-06-19 00:55:29 +08:00
完善save
This commit is contained in:
@@ -14,9 +14,10 @@ Get hamming distance between two dhash strings
|
|||||||
Scan all images like 编码后哈希.webp
|
Scan all images like 编码后哈希.webp
|
||||||
### func Pick(exclude []string) string
|
### func Pick(exclude []string) string
|
||||||
Pick a random image
|
Pick a random image
|
||||||
### func Saveimgbytes(b []byte, imgdir string, uid string, force bool) string
|
### func Saveimgbytes(b []byte, imgdir string, uid string, force bool) (string, string)
|
||||||
### func Saveimg(r io.Reader, imgdir string, uid string) string
|
### func Saveimg(r io.Reader, imgdir string, uid string) (string, string)
|
||||||
Save image into imgdir with name like 编码后哈希.webp
|
Save image into imgdir with name like 编码后哈希.webp
|
||||||
|
Return value: status, dhash
|
||||||
### func Addimage(name string)
|
### func Addimage(name string)
|
||||||
manually add an image name into map
|
manually add an image name into map
|
||||||
### func Imgexsits(name string) bool
|
### func Imgexsits(name string) bool
|
||||||
|
|||||||
24
storage.go
24
storage.go
@@ -69,8 +69,8 @@ func Addimage(name string) {
|
|||||||
images["sum"] = append(images["sum"], name)
|
images["sum"] = append(images["sum"], name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Saveimgbytes Save image into imgdir with name like 编码后哈希.webp
|
// Saveimgbytes Save image into imgdir with name like 编码后哈希.webp Return value: status, dhash
|
||||||
func Saveimgbytes(b []byte, imgdir string, uid string, force bool) string {
|
func Saveimgbytes(b []byte, imgdir string, uid string, force bool) (string, string) {
|
||||||
r := bytes.NewReader(b)
|
r := bytes.NewReader(b)
|
||||||
img, _, err := image.Decode(r)
|
img, _, err := image.Decode(r)
|
||||||
iswebp := false
|
iswebp := false
|
||||||
@@ -81,53 +81,53 @@ func Saveimgbytes(b []byte, imgdir string, uid string, force bool) string {
|
|||||||
iswebp = true
|
iswebp = true
|
||||||
} else {
|
} else {
|
||||||
log.Errorf("[saveimg] decode image error: %v\n", err)
|
log.Errorf("[saveimg] decode image error: %v\n", err)
|
||||||
return "\"stat\": \"notanimg\""
|
return "\"stat\": \"notanimg\"", ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dh, err := GetDHashStr(img)
|
dh, err := GetDHashStr(img)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("[saveimg] get dhash error: %v\n", err)
|
log.Errorf("[saveimg] get dhash error: %v\n", err)
|
||||||
return "\"stat\": \"dherr\""
|
return "\"stat\": \"dherr\"", ""
|
||||||
}
|
}
|
||||||
if force && Imgexsits(dh) {
|
if force && Imgexsits(dh) {
|
||||||
log.Debugf("[saveimg] force find similar image %s.\n", dh)
|
log.Debugf("[saveimg] force find similar image %s.\n", dh)
|
||||||
return "\"stat\":\"exist\", \"img\": \"" + url.QueryEscape(dh) + "\""
|
return "\"stat\":\"exist\", \"img\": \"" + url.QueryEscape(dh) + "\"", dh
|
||||||
} else {
|
} else {
|
||||||
for _, name := range images["sum"] {
|
for _, name := range images["sum"] {
|
||||||
diff, err := HammDistance(dh, name)
|
diff, err := HammDistance(dh, name)
|
||||||
if err == nil && diff < 10 { // 认为是一张图片
|
if err == nil && diff < 10 { // 认为是一张图片
|
||||||
log.Debugf("[saveimg] old %s.\n", name)
|
log.Debugf("[saveimg] old %s.\n", name)
|
||||||
return "\"stat\":\"exist\", \"img\": \"" + url.QueryEscape(name) + "\""
|
return "\"stat\":\"exist\", \"img\": \"" + url.QueryEscape(name) + "\"", name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f, err := os.Create(imgdir + dh + ".webp")
|
f, err := os.Create(imgdir + dh + ".webp")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("[saveimg] create webp file error: %v\n", err)
|
log.Errorf("[saveimg] create webp file error: %v\n", err)
|
||||||
return "\"stat\": \"ioerr\""
|
return "\"stat\": \"ioerr\"", ""
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
if !iswebp {
|
if !iswebp {
|
||||||
options, err := encoder.NewLossyEncoderOptions(encoder.PresetDefault, 75)
|
options, err := encoder.NewLossyEncoderOptions(encoder.PresetDefault, 75)
|
||||||
if err != nil || webp.Encode(f, img, options) != nil {
|
if err != nil || webp.Encode(f, img, options) != nil {
|
||||||
log.Errorf("[saveimg] encode webp error: %v\n", err)
|
log.Errorf("[saveimg] encode webp error: %v\n", err)
|
||||||
return "\"stat\": \"encerr\""
|
return "\"stat\": \"encerr\"", ""
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
r.Seek(0, io.SeekStart)
|
r.Seek(0, io.SeekStart)
|
||||||
c, err := io.Copy(f, r)
|
c, err := io.Copy(f, r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("[saveimg] copy file error: %v\n", err)
|
log.Errorf("[saveimg] copy file error: %v\n", err)
|
||||||
return "\"stat\": \"ioerr\""
|
return "\"stat\": \"ioerr\"", ""
|
||||||
}
|
}
|
||||||
log.Debugf("[saveimg] save %d bytes.\n", c)
|
log.Debugf("[saveimg] save %d bytes.\n", c)
|
||||||
}
|
}
|
||||||
log.Debugf("[saveimg] new %s.\n", dh)
|
log.Debugf("[saveimg] new %s.\n", dh)
|
||||||
return "\"stat\":\"success\", \"img\": \"" + url.QueryEscape(dh) + "\""
|
return "\"stat\":\"success\", \"img\": \"" + url.QueryEscape(dh) + "\"", dh
|
||||||
}
|
}
|
||||||
|
|
||||||
// Saveimg Save image into imgdir with name like 编码后哈希.webp
|
// Saveimg Save image into imgdir with name like 编码后哈希.webp Return value: status, dhash
|
||||||
func Saveimg(r io.Reader, imgdir string, uid string) string {
|
func Saveimg(r io.Reader, imgdir string, uid string) (string, string) {
|
||||||
imgbuff := make([]byte, 1024*1024) // 1m
|
imgbuff := make([]byte, 1024*1024) // 1m
|
||||||
r.Read(imgbuff)
|
r.Read(imgbuff)
|
||||||
return Saveimgbytes(imgbuff, imgdir, uid, false)
|
return Saveimgbytes(imgbuff, imgdir, uid, false)
|
||||||
|
|||||||
Reference in New Issue
Block a user