Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang menjana cincang yang konsisten untuk imej jpeg tanpa menulis ke cakera

Golang menjana cincang yang konsisten untuk imej jpeg tanpa menulis ke cakera

WBOY
WBOYke hadapan
2024-02-11 16:33:08664semak imbas

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

Semasa proses pembangunan, kita selalunya perlu membandingkan persamaan fail imej untuk pengecaman imej, penyahduplikasian dan operasi lain. Menjana cincang imej ialah pendekatan biasa. Biasanya, kita perlu menulis imej ke cakera dan kemudian membacanya untuk pengiraan cincang. Walau bagaimanapun, menggunakan bahasa pengaturcaraan Golang, kita boleh menjana imej jpeg dengan mudah sambil mengira secara langsung nilai cincang yang konsisten tanpa menulis ke cakera. Ini menjimatkan masa dan ruang cakera dan meningkatkan kecekapan. Artikel ini akan memperincikan cara melaksanakan ciri ini di Golang.

Kandungan soalan

Baru dalam pengimejan golang

Saya cuba menjana cincang yang konsisten untuk imej jpeg. Apabila saya memuatkan semula imej selepas menulisnya ke cakera sebagai JPEG (yang dijangkakan), memuatkan imej dan menjana cincang pada bait mentah menghasilkan cincangan yang berbeza. Sebaik sahaja saya menulis RBGA ke cakera sebagai JPEG, piksel diubah suai, yang merosakkan cincang yang saya kira sebelum ini.

Hashing fail hash("abc.jpeg") bermakna saya perlu menulis ke cakera;

    Adakah terdapat sebarang tetapan yang boleh saya gunakan untuk mengawal tingkah laku piksel jpeg output semasa membaca/menulis
  • Perlukah saya menggunakan *imej.RGBA? Imej input ialah *imej.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
Penyelesaian

Anda boleh menggunakan cincang sebagai sasaran penulis dan gunakan

untuk mengira cincang semasa menulis fail: io.MultiWriter

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

Atas ialah kandungan terperinci Golang menjana cincang yang konsisten untuk imej jpeg tanpa menulis ke cakera. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam