개발 과정에서 이미지 인식, 중복 제거 및 기타 작업을 위해 이미지 파일의 유사성을 비교해야 하는 경우가 많습니다. 이미지의 해시를 생성하는 것이 일반적인 접근 방식입니다. 일반적으로 이미지를 디스크에 쓴 다음 해시 계산을 위해 읽어야 합니다. 그러나 Golang 프로그래밍 언어를 사용하면 디스크에 쓰지 않고도 JPEG 이미지를 생성하면서 일관된 해시 값을 직접 쉽게 계산할 수 있습니다. 이를 통해 시간과 디스크 공간이 절약되고 효율성이 향상됩니다. 이 문서에서는 Golang에서 이 기능을 구현하는 방법을 자세히 설명합니다.
골랭 이미징 입문
Jpeg 이미지에 대해 일관된 해시를 생성하려고 합니다. 이미지를 JPEG로 디스크에 기록한 후(예상됨) 다시 로드하면 이미지를 로드하고 원시 바이트에 해시를 생성하면 다른 해시가 생성됩니다. RBGA를 JPEG로 디스크에 기록하면 픽셀이 수정되어 이전에 계산한 해시가 손상됩니다.
파일을 해싱하면 hash("abc.jpeg")
디스크에 다시 읽어야 한다는 뜻입니다.
// Open the input image file inputFile, _ := os.Open("a.jpg") defer inputFile.Close() // Decode the input image inputImage, _, _ := image.Decode(inputFile) // Get the dimensions of the input image width := inputImage.Bounds().Dx() height := inputImage.Bounds().Dy() subWidth := width / 4 subHeight := height / 4 // Create a new image subImg := image.NewRGBA(image.Rect(0, 0, subWidth, subHeight)) draw.Draw(subImg, subImg.Bounds(), inputImage, image.Point{0, 0}, draw.Src) // id want the hashes to be the same for read / write but they will always differ hash1 := sha256.Sum256(imageToBytes(subImg)) fmt.Printf("<---OUT [%s] %x\n", filename, hash1) jpg, _ := os.Create("mytest.jpg") _ = jpeg.Encode(jpg, subImg, nil) jpg.Close() // upon reading it back in the pixels are ever so slightly diff f, _ := os.Open("mytest.jpg") img, _, _ := image.Decode(f) jpg_input := image.NewRGBA(img.Bounds()) draw.Draw(jpg_input, img.Bounds(), img, image.Point{0, 0}, draw.Src) hash2 := sha256.Sum256(imageToBytes(jpg_input)) fmt.Printf("--->IN [%s] %x\n", filename, hash2) // real world use case is.. // generate subtile of large image plus hash // if hash in a dbase // pixel walk to see if hash collision occurred // if pixels are different // deal with it... /// else // object.filename = dbaseb.filename // else // add filename to dbase with hash as the lookup // write to jpeg to disk
해시를 작성자의 대상으로 사용하고 io.MultiWriter
를 사용하여 파일을 쓰는 동안 해시를 계산할 수 있습니다.
위 내용은 Golang은 디스크에 쓰지 않고도 JPEG 이미지에 대한 일관된 해시를 생성합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!