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.
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;
// 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
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!