Created
March 29, 2017 00:16
-
-
Save shawngraham/e4e633328c12402147601c980803a764 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ for f in sourceimages/*; do ruby image-glitch.rb $f ; done |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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