Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shawngraham/e4e633328c12402147601c980803a764 to your computer and use it in GitHub Desktop.
Save shawngraham/e4e633328c12402147601c980803a764 to your computer and use it in GitHub Desktop.
$ for f in sourceimages/*; do ruby image-glitch.rb $f ; done
#!/usr/bin/env ruby
# image-glitch.rb
# Author: William Woodruff with a very minor tweak at the end by Shawn Graham
# ------------------------
# 'Glitch' an image by repeatedly compositing it over itself at various
# coordinates and in various fashions.
# ------------------------
# This code is licensed by William Woodruff under the MIT License.
# http://opensource.org/licenses/MIT
require 'rmagick'
composite_operators = [
Magick::AddCompositeOp,
Magick::AtopCompositeOp,
Magick::BumpmapCompositeOp,
Magick::ColorBurnCompositeOp,
Magick::ColorDodgeCompositeOp,
Magick::ColorizeCompositeOp,
Magick::HardLightCompositeOp,
Magick::HueCompositeOp,
Magick::InCompositeOp,
Magick::LightenCompositeOp,
Magick::LinearBurnCompositeOp,
Magick::LinearDodgeCompositeOp,
Magick::LinearLightCompositeOp,
Magick::LuminizeCompositeOp,
Magick::MultiplyCompositeOp,
Magick::PegtopLightCompositeOp,
Magick::PinLightCompositeOp,
Magick::PlusCompositeOp,
Magick::ReplaceCompositeOp,
Magick::SaturateCompositeOp,
Magick::SoftLightCompositeOp,
Magick::VividLightCompositeOp,
Magick::XorCompositeOp
]
file, level = ARGV.shift(2)
if level.nil?
level = 10
else
level = Integer(level)
end
if file.nil?
puts "Usage: #{$PROGRAM_NAME} <image> [glitch level]"
exit 1
end
in_image = Magick::Image.read(file).first
out_image = in_image.dup
width = in_image.columns
height = in_image.rows
level.times do
start_x = rand(0...width)
start_y = rand(0...height)
case rand(1..4)
when 1
out_image.composite!(in_image, start_x, start_y, composite_operators.sample)
when 2
out_image.composite!(in_image, -start_x, start_y, composite_operators.sample)
when 3
out_image.composite!(in_image, start_x, -start_y, composite_operators.sample)
when 4
out_image.composite!(in_image, -start_x, -start_y, composite_operators.sample)
end
end
def filename
random_string
end
def random_string
@string ||= "#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}.png"
end
sleep 1
out_image.write(filename)
var express = require('express'),
fs = require('fs'),
path = require('path'),
request = require('request'),
app = express(),
Twit = require('twit'),
config = {
consumer_key: process.env.CONSUMER_KEY,
consumer_secret: process.env.CONSUMER_SECRET,
access_token: process.env.ACCESS_TOKEN,
access_token_secret: process.env.ACCESS_TOKEN_SECRET
};
var T = new Twit(config);
function pick_random_image(images){
return images[Math.floor(Math.random() * images.length)];
}
function upload_random_image_remote(urls, callback){
console.log('Loading remote image...');
request({url: pick_random_image(urls), encoding: null}, function (err, res, body) {
if (!err && res.statusCode == 200) {
var b64content = 'data:' + res.headers['content-type'] + ';base64,',
image = body.toString('base64');
console.log('Image loaded!');
//post the image
T.post('media/upload', {media_data: image}, function (err, data, response) {
if (err){
console.log('ERROR:');
console.log(err);
// response.sendStatus(500);
}
else{
console.log('Now tweeting it...');
T.post('statuses/update', {
media_ids: new Array(data.media_id_string)
},
function(err, data, response) {
if (err){
console.log('ERROR:');
console.log(err);
// response.sendStatus(500);
}
else{
console.log('Posted an image!');
// response.sendStatus(200);
}
}
);
}
});
} else {
console.log('ERROR:');
console.log(err);
// response.sendStatus(500);
}
});
}
function extension_check(url) {
/* Check if file has a known image extension, courtesy of revdancatt. */
var extName;
extName = path.extname(url).toLowerCase();
return extName === ".png" || extName === ".jpg" || extName === ".jpeg";
};
app.get("/", function (request, response) {
response.writeHeader(200, {"Content-Type": "text/html"});
response.write('<h1>random-image-twitterbot</h1><a href="https://glitch.com/edit/#!/random-image-twitterbot">See README.md</a></head>');
response.end();
});
app.all("/tweet", function (request, response) {
console.log("Received a request...");
fs.readFile('./.glitch-assets', 'utf8', function (err,data) {
if (err) {
console.log('ERROR:');
console.log(err);
return false;
}
data = data.split('\n');
var urls = [], url;
for (var i = 0, j = data.length; i < j; i++){
if (data[i].length){
url = JSON.parse(data[i]).url;
if (extension_check(url)){
urls.push(url);
}
}
}
upload_random_image_remote(urls);
});
});
var listener = app.listen(process.env.PORT, function () {
console.log('Your app is listening on port ' + listener.address().port);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment