У меня есть служба, которая сравнивает два закодирована base64 строки изображенияСравнение строк base64 изображения в Golang
Моя первая попытка показала, что есть различия в метаданных в то время как фактическое изображение (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
}
jpeg - сжатие с потерями и зависит от кодировщика/декодера, поэтому вы не можете точно сравнивать данные изображения с различными файлами jpeg (а сравнение визуального сходства - очень большой вопрос для ответа SO). Однако, если размер файла точно такой же, то вы, вероятно, имеете одинаковое изображение и неправильно сравниваете base64. (также гораздо эффективнее сравнивать хэш, почему сравнивать данные всего изображения?) – JimB
Две возможности: 1) фактические данные изображения идентичны, и только заголовки разные, и 2) изображение * выглядит * тем же, но фактически различаются на уровне данных изображения. Для первого вы должны убрать метаданные и сравнить только данные изображения. Для этого потребуется некоторое знание формата JPEG. Для последнего вам понадобится какой-то алгоритм «хеширования изображения», например. PhotoDNA. Эти алгоритмы хэш-изображения визуально и предназначены для надежного масштабирования и вращения. – smarx