比较Golang中的base64图像字符串

时间:2016-07-19 19:19:37

标签: image go base64

我有一项比较两个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
}

1 个答案:

答案 0 :(得分:3)

Perceptual Hash是一个计算phash的库;基于视觉特征的图像散列。 github.com/carlogit/phash是一个golang实现。它具有创建和比较两个哈希的功能,以提供一个距离'表明两个图像有多么不同。

出于兴趣,我尝试了一下,使用起来很简单并且对一些测试图像有效。例如:

Queenstown Queenstown distance: 0

Queenstown Queenstown Gold distance: 2

Queenstown Homer Saddle distance: 32

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
}