You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
2 weeks ago
|
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
|
||
|
}
|