|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"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")
|
|
|
|
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func copyImage(inputFile string, outputFile string) 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 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")
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func generateGlitchedSequence(inputFile string, totalImages int, shitSize int64, iterations int64) {
|
|
|
|
for i := 1; i <= totalImages; i++ {
|
|
|
|
outputFileName := fmt.Sprintf("img_glitched_%d.jpeg", i) // Generate unique filenames
|
|
|
|
|
|
|
|
// Randomly decide whether to glitch or copy the image
|
|
|
|
if rand.Int32N(2) == 0 {
|
|
|
|
// Glitched image
|
|
|
|
err := glitchImage(inputFile, outputFileName, shitSize, iterations)
|
|
|
|
check(err, "failed to glitch image: %w")
|
|
|
|
} else {
|
|
|
|
// Normal image
|
|
|
|
err := copyImage(inputFile, outputFileName)
|
|
|
|
check(err, "failed to copy normal image: %w")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|