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.
glitch_img/glitch.go

101 lines
2.8 KiB

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")
}
}
}