package main import ( "math/rand/v2" "os" "path/filepath" ) func makeOutputDir() { // Default to just "output" err := os.Mkdir("output", 0755) check(err, "cannot make directory") } func glitchImage(inputFile string, outputFile string, shitSize int64, iterations int64) error { // Ensure the output directory exists makeOutputDir() // 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 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() // 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) _, err = destination.Write(shit) check(err, "failed to write shit data: %w") // fmt.Printf("Successfully wrote %d bytes of shit at offset %d in file %s\n", shitSize, offset, outputFilePath) } return nil }