gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:50:48 26 4
gpt4 key购买 nike

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 在写入文件时计算哈希:

hash:=sha256.New()
jpeg.Encode(io.MultiWriter(file,hash),img,nil)
hashValue:=hash.Sum(nil)

关于image - Golang 为 jpeg 图像生成一致的哈希值,而无需写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77153217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com