>  기사  >  백엔드 개발  >  Golang은 디스크에 쓰지 않고도 JPEG 이미지에 대한 일관된 해시를 생성합니다.

Golang은 디스크에 쓰지 않고도 JPEG 이미지에 대한 일관된 해시를 생성합니다.

WBOY
WBOY앞으로
2024-02-11 16:33:08716검색

Golang 为 jpeg 图像生成一致的哈希值,而无需写入磁盘

개발 과정에서 이미지 인식, 중복 제거 및 기타 작업을 위해 이미지 파일의 유사성을 비교해야 하는 경우가 많습니다. 이미지의 해시를 생성하는 것이 일반적인 접근 방식입니다. 일반적으로 이미지를 디스크에 쓴 다음 해시 계산을 위해 읽어야 합니다. 그러나 Golang 프로그래밍 언어를 사용하면 디스크에 쓰지 않고도 JPEG 이미지를 생성하면서 일관된 해시 값을 직접 쉽게 계산할 수 있습니다. 이를 통해 시간과 디스크 공간이 절약되고 효율성이 향상됩니다. 이 문서에서는 Golang에서 이 기능을 구현하는 방법을 자세히 설명합니다.

질문 내용

골랭 이미징 입문

Jpeg 이미지에 대해 일관된 해시를 생성하려고 합니다. 이미지를 JPEG로 디스크에 기록한 후(예상됨) 다시 로드하면 이미지를 로드하고 원시 바이트에 해시를 생성하면 다른 해시가 생성됩니다. RBGA를 JPEG로 디스크에 기록하면 픽셀이 수정되어 이전에 계산한 해시가 손상됩니다.

파일을 해싱하면 hash("abc.jpeg")디스크에 다시 읽어야 한다는 뜻입니다.

  • 읽기/쓰기 시 출력 jpeg 픽셀의 동작을 제어하는 ​​데 사용할 수 있는 설정이 있습니까
  • *image.RGBA를 사용해야 하나요? 입력 이미지는 *image.YCbCr?
  • 입니다.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제