pxlsrt 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7566105f4c2c7515705d43a31ab5e8013a484b0a
4
- data.tar.gz: 2130b0bd776aa27fe9baf3e8f770e7219f6499ec
3
+ metadata.gz: b9904ad442d8b272d6aa9e196085efc13e9e6c0e
4
+ data.tar.gz: 145c0cae2d397312d85a4c3627581eb2076a95a8
5
5
  SHA512:
6
- metadata.gz: b6dc7505dc8e83de9cb37f2a99db63268f15cd041f14e740c6401862fe87614cda01cf8b2ed9760f3c91d4024eb22b329f4caafea96f6dc50c1aaae8dcf12e91
7
- data.tar.gz: de29855fa6fb47ef7a61408d842aeba64dc8c2dfc9da3b773e390dbe4abda2e62bca4813227647db426f290aa14a8112b5722d7a31a51c76b1a58629e8d4bd7d
6
+ metadata.gz: 2fc1fd26d049302824076066ec5a495ba27f76402263e20aba2a02dd673357a6b46d4b5685bea5a1c6935ad51512ba566ded3ee43b0f786f0e1baf1dd80aa25d
7
+ data.tar.gz: 204629fbe1687469b21fea3f1bf2a94350fa2ad1b657625cbd753cf11a9ddba06a683542bc470678cab1116720263ba491ca3190368b6d058ce8d4ed7e3e3dd9
data/lib/pxlsrt/brute.rb CHANGED
@@ -80,14 +80,14 @@ module Pxlsrt
80
80
  end
81
81
  if options[:vertical]==true
82
82
  Pxlsrt::Helpers.verbose("Rotating image for vertical mode...") if options[:verbose]
83
- kml=Pxlsrt::Colors.rotateImage(kml, w, h, 3)
83
+ kml=Pxlsrt::Lines.rotateImage(kml, w, h, 3)
84
84
  w,h=h,w
85
85
  end
86
86
  toImage=[]
87
87
  if !options[:diagonal]
88
88
  Pxlsrt::Helpers.verbose("Pixel sorting using method '#{options[:method]}'...") if options[:verbose]
89
- for m in Pxlsrt::Colors.imageRGBLines(kml, w)
90
- sliceRanges=Pxlsrt::Colors.randomSlices(m, options[:min], options[:max])
89
+ for m in Pxlsrt::Lines.imageRGBLines(kml, w)
90
+ sliceRanges=Pxlsrt::Lines.randomSlices(m, options[:min], options[:max])
91
91
  newInTown=[]
92
92
  if options[:smooth]!=true
93
93
  for ranger in sliceRanges
@@ -105,10 +105,10 @@ module Pxlsrt
105
105
  end
106
106
  else
107
107
  Pxlsrt::Helpers.verbose("Determining diagonals...") if options[:verbose]
108
- dia=Pxlsrt::Colors.getDiagonals(kml,w,h)
108
+ dia=Pxlsrt::Lines.getDiagonals(kml,w,h)
109
109
  Pxlsrt::Helpers.verbose("Pixel sorting using method '#{options[:method]}'...") if options[:verbose]
110
110
  for m in dia.keys
111
- sliceRanges=Pxlsrt::Colors.randomSlices(dia[m], options[:min], options[:max])
111
+ sliceRanges=Pxlsrt::Lines.randomSlices(dia[m], options[:min], options[:max])
112
112
  newInTown=[]
113
113
  if options[:smooth]!=true
114
114
  for ranger in sliceRanges
@@ -125,11 +125,11 @@ module Pxlsrt
125
125
  dia[m]=newInTown
126
126
  end
127
127
  Pxlsrt::Helpers.verbose("Setting diagonals back to standard lines...") if options[:verbose]
128
- toImage=Pxlsrt::Colors.fromDiagonals(dia,w)
128
+ toImage=Pxlsrt::Lines.fromDiagonals(dia,w)
129
129
  end
130
130
  if options[:vertical]==true
131
131
  Pxlsrt::Helpers.verbose("Rotating back (because of vertical mode).") if options[:verbose]
132
- toImage=Pxlsrt::Colors.rotateImage(toImage, w,h,1)
132
+ toImage=Pxlsrt::Lines.rotateImage(toImage, w,h,1)
133
133
  w,h=h,w
134
134
  end
135
135
  Pxlsrt::Helpers.verbose("Giving pixels new RGB values...") if options[:verbose]
data/lib/pxlsrt/colors.rb CHANGED
@@ -2,7 +2,7 @@ require "oily_png"
2
2
 
3
3
  module Pxlsrt
4
4
  ##
5
- # Includes color and image operations.
5
+ # Includes color operations.
6
6
  class Colors
7
7
  ##
8
8
  # Converts a ChunkyPNG pixel into an array of the red, green, blue, and alpha values
@@ -15,65 +15,6 @@ module Pxlsrt
15
15
  return File.read(path).bytes==[137, 80, 78, 71, 10]
16
16
  end
17
17
  ##
18
- # ChunkyPNG's rotation was a little slow and doubled runtime.
19
- # This "rotates" an array, based on the width and height.
20
- # It uses math and it's really cool, trust me.
21
- def self.rotateImage(what, width, height, a)
22
- nu=[]
23
- case a
24
- when 0, 360, 4
25
- nu=what
26
- when 1, 90
27
- for xy in 0..(what.length-1)
28
- nu[((height-1)-(xy/width).floor)+(xy % width)*height]=what[xy]
29
- end
30
- when 2, 180
31
- nu=what.reverse
32
- when 3, 270
33
- for xy in 0..(what.length-1)
34
- nu[(xy/width).floor+((width-1)-(xy % width))*height]=what[xy]
35
- end
36
- end
37
- return nu
38
- end
39
- ##
40
- # Gets "rows" of an array based on a width
41
- def self.imageRGBLines(image, width)
42
- return image.each_slice(width).to_a
43
- end
44
- ##
45
- # Outputs random slices of an array.
46
- # Because of the requirements of pxlsrt, it doesn't actually slice the array, bute returns a range-like array. Example:
47
- # [[0, 5], [6, 7], [8, 10]]
48
- def self.randomSlices(arr, minLength, maxLength)
49
- len=arr.length-1
50
- if len!=0
51
- min=[minLength, maxLength].min
52
- max=[maxLength, minLength].max
53
- if min > len
54
- min=len
55
- end
56
- if max > len
57
- max=len
58
- end
59
- nu=[[0, rand(min..max)]]
60
- last=nu.first[1]
61
- sorting=true
62
- while sorting do
63
- if (len-last) <= max
64
- nu.push([last+1, len])
65
- sorting=false
66
- else
67
- nu.push([last+1, last+1+rand(min..max)])
68
- last=nu.last[1]
69
- end
70
- end
71
- else
72
- nu=[[0,0]]
73
- end
74
- return nu
75
- end
76
- ##
77
18
  # This is really lame. Adds first three values of an array together.
78
19
  def self.pxldex(pxl)
79
20
  return pxl[0]+pxl[1]+pxl[2]
@@ -202,52 +143,9 @@ module Pxlsrt
202
143
  end
203
144
  end
204
145
  ##
205
- # Uses math to turn an array into an array of diagonals.
206
- def self.getDiagonals(array, width, height)
207
- dias={}
208
- for x in (1-height)..(width-1)
209
- z=[]
210
- for y in 0..(height-1)
211
- if (x+(width+1)*y).between?(width*y, (width*(y+1)-1))
212
- z.push(array[(x+(width+1)*y)])
213
- end
214
- end
215
- dias[x.to_s]=z
216
- end
217
- return dias
218
- end
219
- ##
220
- # Uses math to turn an array of diagonals into a linear array.
221
- def self.fromDiagonals(obj, width)
222
- ell=[]
223
- for k in obj.keys
224
- r=k.to_i
225
- n=r < 0
226
- if n
227
- x=0
228
- y=r.abs
229
- else
230
- x=r
231
- y=0
232
- end
233
- ell[x+y*width]=obj[k].first
234
- for v in 1..(obj[k].length-1)
235
- x+=1
236
- y+=1
237
- ell[x+y*width]=obj[k][v]
238
- end
239
- end
240
- return ell
241
- end
242
- ##
243
146
  # Turns an RGB-like array into ChunkyPNG's color
244
147
  def self.arrayToRGBA(a)
245
148
  return ChunkyPNG::Color.rgba(a[0], a[1], a[2], a[3])
246
149
  end
247
- ##
248
- # Used in determining Sobel values.
249
- def self.sobelate(i, x,y)
250
- return ChunkyPNG::Color.to_grayscale_bytes(i[x,y]).first
251
- end
252
150
  end
253
151
  end
@@ -0,0 +1,103 @@
1
+ module Pxlsrt
2
+ ##
3
+ # "Line" operations used on arrays f colors.
4
+ class Lines
5
+ ##
6
+ # ChunkyPNG's rotation was a little slow and doubled runtime.
7
+ # This "rotates" an array, based on the width and height.
8
+ # It uses math and it's really cool, trust me.
9
+ def self.rotateImage(what, width, height, a)
10
+ nu=[]
11
+ case a
12
+ when 0, 360, 4
13
+ nu=what
14
+ when 1, 90
15
+ for xy in 0..(what.length-1)
16
+ nu[((height-1)-(xy/width).floor)+(xy % width)*height]=what[xy]
17
+ end
18
+ when 2, 180
19
+ nu=what.reverse
20
+ when 3, 270
21
+ for xy in 0..(what.length-1)
22
+ nu[(xy/width).floor+((width-1)-(xy % width))*height]=what[xy]
23
+ end
24
+ end
25
+ return nu
26
+ end
27
+ ##
28
+ # Gets "rows" of an array based on a width
29
+ def self.imageRGBLines(image, width)
30
+ return image.each_slice(width).to_a
31
+ end
32
+ ##
33
+ # Outputs random slices of an array.
34
+ # Because of the requirements of pxlsrt, it doesn't actually slice the array, bute returns a range-like array. Example:
35
+ # [[0, 5], [6, 7], [8, 10]]
36
+ def self.randomSlices(arr, minLength, maxLength)
37
+ len=arr.length-1
38
+ if len!=0
39
+ min=[minLength, maxLength].min
40
+ max=[maxLength, minLength].max
41
+ if min > len
42
+ min=len
43
+ end
44
+ if max > len
45
+ max=len
46
+ end
47
+ nu=[[0, rand(min..max)]]
48
+ last=nu.first[1]
49
+ sorting=true
50
+ while sorting do
51
+ if (len-last) <= max
52
+ nu.push([last+1, len])
53
+ sorting=false
54
+ else
55
+ nu.push([last+1, last+1+rand(min..max)])
56
+ last=nu.last[1]
57
+ end
58
+ end
59
+ else
60
+ nu=[[0,0]]
61
+ end
62
+ return nu
63
+ end
64
+ ##
65
+ # Uses math to turn an array into an array of diagonals.
66
+ def self.getDiagonals(array, width, height)
67
+ dias={}
68
+ for x in (1-height)..(width-1)
69
+ z=[]
70
+ for y in 0..(height-1)
71
+ if (x+(width+1)*y).between?(width*y, (width*(y+1)-1))
72
+ z.push(array[(x+(width+1)*y)])
73
+ end
74
+ end
75
+ dias[x.to_s]=z
76
+ end
77
+ return dias
78
+ end
79
+ ##
80
+ # Uses math to turn an array of diagonals into a linear array.
81
+ def self.fromDiagonals(obj, width)
82
+ ell=[]
83
+ for k in obj.keys
84
+ r=k.to_i
85
+ n=r < 0
86
+ if n
87
+ x=0
88
+ y=r.abs
89
+ else
90
+ x=r
91
+ y=0
92
+ end
93
+ ell[x+y*width]=obj[k].first
94
+ for v in 1..(obj[k].length-1)
95
+ x+=1
96
+ y+=1
97
+ ell[x+y*width]=obj[k][v]
98
+ end
99
+ end
100
+ return ell
101
+ end
102
+ end
103
+ end
data/lib/pxlsrt/smart.rb CHANGED
@@ -80,12 +80,22 @@ module Pxlsrt
80
80
  valued="start"
81
81
  k=[]
82
82
  Pxlsrt::Helpers.verbose("Getting Sobel values and colors for pixels...") if options[:verbose]
83
+ grey=img.grayscale
83
84
  for xy in 0..(w*h-1)
84
85
  x=xy % w
85
86
  y=(xy/w).floor
86
87
  if x!=0 and x!=(w-1) and y!=0 and y!=(h-1)
87
- pixel_x=(sobel_x[0][0]*Pxlsrt::Colors.sobelate(img,x-1,y-1))+(sobel_x[0][1]*Pxlsrt::Colors.sobelate(img,x,y-1))+(sobel_x[0][2]*Pxlsrt::Colors.sobelate(img,x+1,y-1))+(sobel_x[1][0]*Pxlsrt::Colors.sobelate(img,x-1,y))+(sobel_x[1][1]*Pxlsrt::Colors.sobelate(img,x,y))+(sobel_x[1][2]*Pxlsrt::Colors.sobelate(img,x+1,y))+(sobel_x[2][0]*Pxlsrt::Colors.sobelate(img,x-1,y+1))+(sobel_x[2][1]*Pxlsrt::Colors.sobelate(img,x,y+1))+(sobel_x[2][2]*Pxlsrt::Colors.sobelate(img,x+1,y+1))
88
- pixel_y=(sobel_y[0][0]*Pxlsrt::Colors.sobelate(img,x-1,y-1))+(sobel_y[0][1]*Pxlsrt::Colors.sobelate(img,x,y-1))+(sobel_y[0][2]*Pxlsrt::Colors.sobelate(img,x+1,y-1))+(sobel_y[1][0]*Pxlsrt::Colors.sobelate(img,x-1,y))+(sobel_y[1][1]*Pxlsrt::Colors.sobelate(img,x,y))+(sobel_y[1][2]*Pxlsrt::Colors.sobelate(img,x+1,y))+(sobel_y[2][0]*Pxlsrt::Colors.sobelate(img,x-1,y+1))+(sobel_y[2][1]*Pxlsrt::Colors.sobelate(img,x,y+1))+(sobel_y[2][2]*Pxlsrt::Colors.sobelate(img,x+1,y+1))
88
+ t1=ChunkyPNG::Color.r(grey[x-1,y-1])
89
+ t2=ChunkyPNG::Color.r(grey[x,y-1])
90
+ t3=ChunkyPNG::Color.r(grey[x+1,y-1])
91
+ t4=ChunkyPNG::Color.r(grey[x-1,y])
92
+ t5=ChunkyPNG::Color.r(grey[x,y])
93
+ t6=ChunkyPNG::Color.r(grey[x+1,y])
94
+ t7=ChunkyPNG::Color.r(grey[x-1,y+1])
95
+ t8=ChunkyPNG::Color.r(grey[x,y+1])
96
+ t9=ChunkyPNG::Color.r(grey[x+1,y+1])
97
+ pixel_x=(sobel_x[0][0]*t1)+(sobel_x[0][1]*t2)+(sobel_x[0][2]*t3)+(sobel_x[1][0]*t4)+(sobel_x[1][1]*t5)+(sobel_x[1][2]*t6)+(sobel_x[2][0]*t7)+(sobel_x[2][1]*t8)+(sobel_x[2][2]*t9)
98
+ pixel_y=(sobel_y[0][0]*t1)+(sobel_y[0][1]*t2)+(sobel_y[0][2]*t3)+(sobel_y[1][0]*t4)+(sobel_y[1][1]*t5)+(sobel_y[1][2]*t6)+(sobel_y[2][0]*t7)+(sobel_y[2][1]*t8)+(sobel_y[2][2]*t9)
89
99
  val = Math.sqrt(pixel_x * pixel_x + pixel_y * pixel_y).ceil
90
100
  else
91
101
  val = 2000000000
@@ -94,11 +104,11 @@ module Pxlsrt
94
104
  end
95
105
  if options[:vertical]==true
96
106
  Pxlsrt::Helpers.verbose("Rotating image for vertical mode...") if options[:verbose]
97
- k=Pxlsrt::Colors.rotateImage(k,w,h,3)
107
+ k=Pxlsrt::Lines.rotateImage(k,w,h,3)
98
108
  w,h=h,w
99
109
  end
100
110
  if !options[:diagonal]
101
- lines=Pxlsrt::Colors.imageRGBLines(k, w)
111
+ lines=Pxlsrt::Lines.imageRGBLines(k, w)
102
112
  Pxlsrt::Helpers.verbose("Determining bands with a#{options[:absolute] ? "n absolute" : " relative"} threshold of #{options[:threshold]}...") if options[:verbose]
103
113
  bands=Array.new()
104
114
  for j in lines
@@ -148,7 +158,7 @@ module Pxlsrt
148
158
  end
149
159
  else
150
160
  Pxlsrt::Helpers.verbose("Determining diagonals...") if options[:verbose]
151
- dia=Pxlsrt::Colors.getDiagonals(k,w,h)
161
+ dia=Pxlsrt::Lines.getDiagonals(k,w,h)
152
162
  Pxlsrt::Helpers.verbose("Determining bands with a#{options[:absolute] ? "n absolute" : " relative"} threshold of #{options[:threshold]}...") if options[:verbose]
153
163
  for j in dia.keys
154
164
  bands=[]
@@ -204,11 +214,11 @@ module Pxlsrt
204
214
  dia[j]=ell
205
215
  end
206
216
  Pxlsrt::Helpers.verbose("Setting diagonals back to standard lines...") if options[:verbose]
207
- image=Pxlsrt::Colors.fromDiagonals(dia,w)
217
+ image=Pxlsrt::Lines.fromDiagonals(dia,w)
208
218
  end
209
219
  if options[:vertical]==true
210
220
  Pxlsrt::Helpers.verbose("Rotating back (because of vertical mode).") if options[:verbose]
211
- image=Pxlsrt::Colors.rotateImage(image,w,h,1)
221
+ image=Pxlsrt::Lines.rotateImage(image,w,h,1)
212
222
  w,h=h,w
213
223
  end
214
224
  Pxlsrt::Helpers.verbose("Giving pixels new RGB values...") if options[:verbose]
@@ -1,5 +1,5 @@
1
1
  ##
2
2
  # The main module, your best friend.
3
3
  module Pxlsrt
4
- VERSION = "1.3.1"
4
+ VERSION = "1.4.0"
5
5
  end
data/lib/pxlsrt.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "pxlsrt/version"
2
- require "pxlsrt/colors"
3
2
  require "pxlsrt/helpers"
3
+ require "pxlsrt/lines"
4
+ require "pxlsrt/colors"
4
5
  require "pxlsrt/brute"
5
6
  require "pxlsrt/smart"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pxlsrt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - EVA-01
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-03 00:00:00.000000000 Z
11
+ date: 2014-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -79,6 +79,7 @@ files:
79
79
  - lib/pxlsrt/brute.rb
80
80
  - lib/pxlsrt/colors.rb
81
81
  - lib/pxlsrt/helpers.rb
82
+ - lib/pxlsrt/lines.rb
82
83
  - lib/pxlsrt/smart.rb
83
84
  - lib/pxlsrt/version.rb
84
85
  homepage: https://github.com/EVA-01/pxlsrt