1
0
mirror of https://github.com/fumiama/imago.git synced 2026-06-19 09:00:25 +08:00

完善save

This commit is contained in:
fumiama
2021-08-10 17:32:11 +08:00
parent 3c99a8c654
commit 22632adb67
2 changed files with 15 additions and 14 deletions

View File

@@ -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

View File

@@ -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)