-
Notifications
You must be signed in to change notification settings - Fork 0
/
glitch_factory.rb
107 lines (103 loc) · 2.42 KB
/
glitch_factory.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
require 'pnglitch'
filters = [:optimized, :sub, :up, :average, :paeth]
methods = [:replace, :transpose, :defect, :graft]
def set_params(filters, methods)
puts "Input path to png file:"
path = gets.chomp()
if (path == "" || path.length <= 4)
puts "...invalid path"
return
end
puts "Select Filter:"
filters.each_with_index do |filter, index|
puts "#{index + 1}. #{filter}"
end
selection = gets.chomp().to_i
filter = filters[selection - 1]
if (selection > filters.length)
puts "...invalid filter"
return
end
puts "Select Method:"
methods.each_with_index do |filter, index|
puts "#{index + 1}. #{filter}"
end
selection = gets.chomp().to_i
method = methods[selection - 1]
if (selection > methods.length)
puts "...invalid filter"
return
end
puts "You selected Filter: #{filter}, and Method: #{method}. Y/N"
cta = gets.chomp();
if cta.upcase == "Y"
if (path && filter && method)
glitch_factory(path, filter, method)
else
puts "Sorry mate"
end
else
return
end
end
def glitch_factory(path, filter, method)
count = 0
[false, true].each do |compress|
if compress && method == :graft
return
end
count += 1
# png instance
png = PNGlitch.open path
# set filter
png.change_all_filters filter unless filter == :optimized
# print glitch options
options = [filter.to_s]
options << method.to_s
options << 'compress' if compress
# define new file
outfile = "#{path}-#{count}-#{options}.png"
puts outfile
# assign methods
process = lambda do |data, range|
case method
when :replace
range.times do
data[rand(data.size)] = 'x'
end
data
when :transpose
x = data.size / 4
data[0, x] + data[x * 2, x] + data[x * 1, x] + data[x * 3..-1]
when :defect
(range / 5).times do
data[rand(data.size)] = ''
end
data
when :graft
png.each_scanline do |line|
line.graft rand(range)
end
png
end
end
# process png output
unless compress
if method == :graft
process.call png, 5
else
png.glitch do |data|
process.call data, 50
end
end
else
png.glitch_after_compress do |data|
process.call data, 10
end
end
##save png
png.save outfile
png.close
end
end
set_params(filters, methods)