mirror of
https://github.com/fumiama/imago.git
synced 2026-06-05 00:10:26 +08:00
42 lines
992 B
Go
42 lines
992 B
Go
package imago
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"image"
|
|
|
|
"github.com/corona10/goimagehash"
|
|
base14 "github.com/fumiama/go-base16384"
|
|
)
|
|
|
|
var lastchar = "㴁"
|
|
|
|
func decodeDHash(imgname string) *goimagehash.ImageHash {
|
|
b, err := base14.UTF82utf16be(StringToBytes(imgname + lastchar))
|
|
if err == nil {
|
|
dhb := base14.Decode(b)
|
|
dh := binary.BigEndian.Uint64(dhb)
|
|
return goimagehash.NewImageHash(dh, goimagehash.DHash)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// HammDistance Get hamming distance between two dhash strings
|
|
func HammDistance(img1 string, img2 string) (int, error) {
|
|
b1 := decodeDHash(img1)
|
|
b2 := decodeDHash(img2)
|
|
return b1.Distance(b2)
|
|
}
|
|
|
|
// GetDHashStr Get image dhash encoded by go-base16384
|
|
func GetDHashStr(img image.Image) (string, error) {
|
|
dh, err := goimagehash.DifferenceHash(img)
|
|
if err == nil {
|
|
var data [8]byte
|
|
binary.BigEndian.PutUint64(data[:], dh.GetHash())
|
|
e := base14.Encode(data[:])
|
|
b, _ := base14.UTF16be2utf8(e)
|
|
return BytesToString(b)[:15], nil
|
|
}
|
|
return "", err
|
|
}
|