diff --git a/imagehash.go b/imagehash.go index 948ae58..5ffbc8b 100644 --- a/imagehash.go +++ b/imagehash.go @@ -6,20 +6,21 @@ package goimagehash import ( "errors" + "fmt" ) -// hashKind describes the kinds of hash. -type hashKind int +// Kind describes the kinds of hash. +type Kind int // ImageHash is a struct of hash computation. type ImageHash struct { hash uint64 - kind hashKind + kind Kind } const ( // Unknown is a enum value of the unknown hash. - Unknown hashKind = iota + Unknown Kind = iota // AHash is a enum value of the average hash. AHash //PHash is a enum value of the perceptual hash. @@ -31,14 +32,14 @@ const ( ) // NewImageHash function creates a new image hash. -func NewImageHash(hash uint64, kind hashKind) *ImageHash { +func NewImageHash(hash uint64, kind Kind) *ImageHash { return &ImageHash{hash: hash, kind: kind} } // Distance method returns a distance between two hashes. func (h *ImageHash) Distance(other *ImageHash) (int, error) { if h.GetKind() != other.GetKind() { - return -1, errors.New("Image hashes's kind should be identical.") + return -1, errors.New("Image hashes's kind should be identical") } diff := 0 @@ -60,7 +61,7 @@ func (h *ImageHash) GetHash() uint64 { } // GetKind method returns a kind of image hash. -func (h *ImageHash) GetKind() hashKind { +func (h *ImageHash) GetKind() Kind { return h.kind } @@ -68,3 +69,44 @@ func (h *ImageHash) GetKind() hashKind { func (h *ImageHash) Set(idx int) { h.hash |= 1 << uint(idx) } + +const strFmt = "%v:%0x" + +// FromString returns an image hash from a hex representation +func FromString(s string) (*ImageHash, error) { + var kindStr string + var hash uint64 + _, err := fmt.Sscanf(s, strFmt, kindStr, hash) + if err != nil { + return nil, errors.New("Couldn't parse string " + s) + } + + kind := Unknown + switch kindStr { + case "a": + kind = AHash + case "p": + kind = PHash + case "d": + kind = DHash + case "w": + kind = WHash + } + return NewImageHash(hash, kind), nil +} + +// ToString returns a hex representation of the hash +func (h *ImageHash) ToString() string { + kindStr := "" + switch h.kind { + case AHash: + kindStr = "a" + case PHash: + kindStr = "p" + case DHash: + kindStr = "d" + case WHash: + kindStr = "w" + } + return fmt.Sprintf(strFmt, kindStr, h.hash) +}