我有一项比较两个base64编码图像字符串的服务
我的初步尝试显示元数据存在差异,而在这种情况下实际图像(JPG)是相同的(尺寸,分辨率,尺寸等)。
有没有办法去除大部分动态元数据,以便我可以比较图像的视觉方面?
目前,我正在使用以下内容......
package converter
import (
"bufio"
"encoding/base64"
"log"
"os"
)
func Base64(path string) (string, error) {
imgFile, err := os.Open(path)
if err != nil {
log.Fatalln(err)
}
defer imgFile.Close()
// create a new buffer base on file size
fInfo, _ := imgFile.Stat()
var size int64 = fInfo.Size()
buf := make([]byte, size)
// read file content into buffer
fReader := bufio.NewReader(imgFile)
fReader.Read(buf)
// convert the buffer bytes to base64 string - use buf.Bytes() for new image
imgBase64Str := base64.StdEncoding.EncodeToString(buf)
return imgBase64Str,nil
}
答案 0 :(得分:3)
Perceptual Hash是一个计算phash的库;基于视觉特征的图像散列。 github.com/carlogit/phash是一个golang实现。它具有创建和比较两个哈希的功能,以提供一个距离'表明两个图像有多么不同。
出于兴趣,我尝试了一下,使用起来很简单并且对一些测试图像有效。例如:
package main
import (
"fmt"
"log"
"os"
"github.com/carlogit/phash"
)
func main() {
if len(os.Args) < 3 {
log.Fatalf("usage: %s <ImageFileA> <ImageFileB>\n", os.Args[0])
}
a := hash(os.Args[1])
b := hash(os.Args[2])
distance := phash.GetDistance(a, b)
fmt.Printf("distance: %d\n", distance)
}
//hash returns a phash of the image
func hash(filename string) string {
img, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer img.Close()
ahash, err := phash.GetHash(img)
if err != nil {
log.Fatal(err)
}
return ahash
}