ホームページ >バックエンド開発 >Golang >Golang はディスクに書き込むことなく JPEG 画像の一貫したハッシュを生成します

Golang はディスクに書き込むことなく JPEG 画像の一貫したハッシュを生成します

WBOY
WBOY転載
2024-02-11 16:33:08735ブラウズ

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

開発プロセス中、画像認識、重複排除、その他の操作を実行するために、画像ファイルの類似性を比較する必要がよくあります。画像のハッシュを生成するのが一般的なアプローチです。通常、イメージをディスクに書き込み、ハッシュ計算のためにそれを読み取る必要があります。しかし、Golang プログラミング言語を使用すると、ディスクに書き込むことなく一貫したハッシュ値を直接計算しながら、簡単に JPEG 画像を生成できます。これにより、時間とディスク容量が節約され、効率が向上します。この記事では、Golang でこの機能を実装する方法について詳しく説明します。

質問内容

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。