package main import ( "fmt" "math/rand/v2" "os" "path/filepath" ) func fillSliceWithASCII(slice []byte) { const asciiMin = 16 const asciiMax = 150 for i := range slice { slice[i] = byte(rand.Int32N(asciiMax-asciiMin+1) + asciiMin) } } func glitchImage(inputFile string, outputFile string, shitSize int64, iterations int64) error { outputFilePath := filepath.Join("output", outputFile) // Open the source file for reading source, err := os.Open(inputFile) check(err, "failed to open source file: %w") defer source.Close() // Create a new file for writing the glitched copy destination, err := os.Create(outputFilePath) check(err, "failed to create output file: %w") defer destination.Close() // Copy the contents of the source file to the destination _, err = destination.ReadFrom(source) check(err, "failed to copy file contents: %w") // Get the Stat() of the destination file fileInfo, err := destination.Stat() check(err, "failed to get file info: %w") // Get the size of the destination file fileSize := fileInfo.Size() if fileSize == 0 { fmt.Println("Cannot glitch file with size of zero bytes!") return fmt.Errorf("input file is zero bytes") } // Generate a random offset within the file var i int64 for i = 0; i < iterations; i++ { offset := rand.Int64N(fileSize) // Seek to the random offset in the destination file _, err = destination.Seek(offset, 0) check(err, "failed to seek to random offset: %w") // Generate random data and write it in shit := make([]byte, shitSize) fillSliceWithASCII(shit) _, err = destination.Write(shit) check(err, "failed to write shit data: %w") } return nil } func copyImage(inputFile string, outputFile string) error { // Prepend the "output" directory to the output file outputFilePath := filepath.Join("output", outputFile) // Open the source file for reading source, err := os.Open(inputFile) check(err, "failed to open source file: %w") defer source.Close() // Create a new file for writing the copy destination, err := os.Create(outputFilePath) check(err, "failed to create output file: %w") defer destination.Close() // Copy the contents of the source file to the destination _, err = destination.ReadFrom(source) check(err, "failed to copy file contents: %w") // no errors return nil } func generateGlitchedSequence(inputFile string, fileExt string, totalImages int, shitSize int64, iterations int64, chanceToRandom int32) error { for i := 1; i <= totalImages; i++ { outputFileName := fmt.Sprintf("img_glitched_%d.%s", i, fileExt) if rand.Int32N(100) < chanceToRandom { // Glitched image err := glitchImage(inputFile, outputFileName, shitSize, iterations) if err != nil { return fmt.Errorf("Cannot glitch image") } } else { // Normal image err := copyImage(inputFile, outputFileName) if err != nil { return fmt.Errorf("Cannot glitch image") } } } // no errors return nil }