stitchify 0.2.6 → 0.4.1

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: 163c7b301bb8c593d7776451c1b6301d779431b9
4
- data.tar.gz: 10c75dc399cad95003d8410e17b600dcb3d3a3bb
3
+ metadata.gz: fa5166b72a59cb8893eb7316050b81c92d733a48
4
+ data.tar.gz: 917832facf0f22cbb4a72380c37c017332a84f63
5
5
  SHA512:
6
- metadata.gz: 1265812071e71ab6a4c4a91fb0b7276985114b62d79dd7e20e3e4c0a0760d0f5d6a945dcf8ba086e9842fc941e11ae12811bc8ce0c31ae2aee42216aa8092bf6
7
- data.tar.gz: 9d8431825fa940807b0b48bff170701cec914885369a858edfdc4a85546260a422bc644d06230cba02ee3001548093c073cd74dcdc0fa62a746d8f315482eaa8
6
+ metadata.gz: 5fce45ca8698ba4abe984858892138fc56c893644eb8a79e9e88396e5835c920c85273b332c0a21b8005c131a73069cda9c09f14be886211cc147979f9d3d893
7
+ data.tar.gz: b1b935d41c642ea5c5bbe789fc9df630b63d9093305d15487dfa82ce5b846826d33dd369cb6aa2a60b5ad52638108b80ee7276b016441b7918ee9fb323e4c384
@@ -1,9 +1,8 @@
1
1
  require 'chroma'
2
2
  require 'color'
3
3
  require 'miro'
4
- require 'pry'
5
4
  require 'rasem'
6
- require 'RMagick'
5
+ require 'rmagick'
7
6
 
8
7
  require 'stitchify/draw_rasem.rb'
9
8
  require 'stitchify/pixelfy.rb'
@@ -21,6 +20,8 @@ class Stitchifier
21
20
  'triangle',
22
21
  'circle',
23
22
  'diamond',
23
+ 'heart',
24
+ 'star',
24
25
  'reverse_triangle',
25
26
  'left_triangle',
26
27
  'right_triangle'
@@ -31,6 +32,7 @@ class Stitchifier
31
32
  :dominant_colors,
32
33
  :img,
33
34
  :img_path,
35
+ :file_path,
34
36
  :num_of_colors,
35
37
  :num_of_off_colors,
36
38
  :pos_x,
@@ -39,7 +41,7 @@ class Stitchifier
39
41
  :stitch_map,
40
42
  :width
41
43
 
42
- def initialize(img_path = '', width = 50, px=10, num_of_colors = 8)
44
+ def initialize(img_path = '', width = 50, px=10, num_of_colors=8, file_path='stitchify.svg')
43
45
  # sets variables
44
46
  self.num_of_colors = num_of_colors
45
47
  set_num_colors
@@ -50,6 +52,7 @@ class Stitchifier
50
52
  self.stitch_map = []
51
53
  self.px = px
52
54
  self.color_set = nil
55
+ self.file_path = file_path
53
56
 
54
57
  unless img_path.empty?
55
58
  make_img
@@ -61,7 +64,7 @@ class Stitchifier
61
64
  end
62
65
 
63
66
  def stitch
64
- d = DrawRasem.new(self.stitch_map, self.width, self.px, self.color_set)
67
+ d = DrawRasem.new(self.stitch_map, self.width, self.px, self.color_set, self.file_path)
65
68
  d.stitch
66
69
  end
67
70
 
@@ -1,17 +1,25 @@
1
1
  class DrawRasem
2
2
 
3
- attr_accessor :px_arr, :width, :px, :pos_x, :pos_y, :height, :color_set
3
+ attr_accessor :color_set,
4
+ :file_path,
5
+ :height,
6
+ :pos_x,
7
+ :pos_y,
8
+ :px,
9
+ :px_arr,
10
+ :width
4
11
 
5
- def initialize(px_arr, width=50, px=10, color_set=[])
12
+ def initialize(px_arr, width=50, px=10, color_set=[], file_path='stitchify.svg')
6
13
  self.px_arr = px_arr
7
14
  self.width = width
8
15
  self.px = px
9
16
  self.color_set = color_set
17
+ self.file_path = file_path
10
18
  clear_vars
11
19
  end
12
20
 
13
21
  def stitch
14
- write(build_rasem_data, file='stitchify.svg')
22
+ write(build_rasem_data, self.file_path)
15
23
  clear_vars
16
24
  end
17
25
 
@@ -31,42 +39,126 @@ class DrawRasem
31
39
  rasem_obj = self
32
40
 
33
41
  Rasem::SVGImage.new(width: 1000000000, height: 100000000) do
42
+ pos_x = rasem_obj.pos_x
43
+ pos_y = rasem_obj.pos_y
44
+ px = rasem_obj.px
45
+ a = px / 4
46
+ b = px / 2
47
+ c = px - a
48
+ d = a / 2
34
49
 
35
- for line_data in rasem_obj.grid
36
- line line_data[0], line_data[1], line_data[2], line_data[3], :stroke_width=>line_data[5]
37
- end
50
+ defs do
51
+ group(id: 'rectangle') do
52
+ rectangle pos_x, pos_y, px, px
53
+ end
38
54
 
39
- for pixel in rasem_obj.px_arr
40
- pos_x = rasem_obj.pos_x
41
- pos_y = rasem_obj.pos_y
42
- px = rasem_obj.px
43
-
44
- case pixel.shape
45
- when 'rectangle'
46
- rectangle pos_x, pos_y, px, px, fill: pixel.hex
47
- when 'x'
55
+ group(id: 'x') do
48
56
  line pos_x, pos_y, pos_x + px, pos_y + px
49
57
  line pos_x, pos_y + px, pos_x + px, pos_y
50
- when 'circle'
51
- circle (pos_x + px/2), (pos_y + px/2), px / 2 - 1, fill: pixel.hex
52
- when 'sm_rectangle'
53
- rectangle pos_x + 1, pos_y + 1, px - 2, px - 2, fill: pixel.hex
54
- when 'triangle'
55
- polygon [pos_x + px/2, pos_y + 1], [pos_x + 1, pos_y + px - 1], [pos_x + px - 1, pos_y + px - 1], fill: pixel.hex
56
- when 'diamond'
57
- polygon [pos_x + px/2, pos_y + 1], [pos_x + 1, pos_y + px/2], [pos_x + px/2, pos_y + px - 1], [pos_x + px - 1, pos_y + px/2], fill: pixel.hex
58
- when 'reverse_triangle'
59
- polygon [pos_x + px/2, pos_y + px - 1], [pos_x + 1, pos_y + 1], [pos_x + px - 1, pos_y + 1], fill: pixel.hex
60
- when 'left_triangle'
61
- polygon [pos_x + 1, pos_y + px/2], [pos_x + px - 1, pos_y + 1], [pos_x + px - 1, pos_y + px - 1], fill: pixel.hex
62
- when 'right_triangle'
63
- polygon [pos_x + px - 1, pos_y + px/2], [pos_x + 1, pos_y + 1], [pos_x + 1, pos_y + px - 1], fill: pixel.hex
64
- else
65
- rectangle pos_x, pos_y, px, px, fill: pixel.hex
66
58
  end
67
59
 
60
+ group(id: 'circle') do
61
+ circle (pos_x + b), (pos_y + b), a + d
62
+ end
63
+
64
+ group(id: 'sm_rectangle') do
65
+ rectangle pos_x + a + 1, pos_y + a + 1, b, b
66
+ end
67
+
68
+ group(id: 'triangle') do
69
+ polygon [pos_x + b, pos_y + a],
70
+ [pos_x + c, pos_y + c],
71
+ [pos_x + a, pos_y + c]
72
+ end
73
+
74
+ group(id: 'diamond') do
75
+ polygon [pos_x + b, pos_y + 1],
76
+ [pos_x + 1, pos_y + b],
77
+ [pos_x + b, pos_y + px - 1],
78
+ [pos_x + px - 1, pos_y + b]
79
+ end
80
+
81
+ group(id: 'reverse_triangle') do
82
+ polygon [pos_x + a, pos_y + a],
83
+ [pos_x + c, pos_y + a],
84
+ [pos_x + b, pos_y + c]
85
+ end
86
+
87
+ group(id: 'left_triangle') do
88
+ polygon [pos_x + a, pos_y + b],
89
+ [pos_x + c, pos_y + a],
90
+ [pos_x + c, pos_y + c]
91
+ end
92
+
93
+ group(id: 'right_triangle') do
94
+ polygon [pos_x + a, pos_y + a],
95
+ [pos_x + c, pos_y + b],
96
+ [pos_x + a, pos_y + c]
97
+ end
98
+
99
+ group(id: 'star') do
100
+ polygon [pos_x + a + 1, pos_y + 1],
101
+ [pos_x + b, pos_y + a + 1],
102
+ [pos_x + c - 1, pos_y + 1],
103
+ [pos_x + c - 1, pos_y + a + 1],
104
+ [pos_x + px - 1, pos_y + a + 1],
105
+ [pos_x + c - 1, pos_y + b],
106
+ [pos_x + px - 1, pos_y + c - 1],
107
+ [pos_x + c - 1, pos_y + c - 1],
108
+ [pos_x + c - 1, pos_y + px - 1],
109
+ [pos_x + b, pos_y + c - 1],
110
+ [pos_x + a + 1, pos_y + px - 1],
111
+ [pos_x + a + 1, pos_y + c - 1],
112
+ [pos_x + 1, pos_y + c - 1],
113
+ [pos_x + a + 1, pos_y + b],
114
+ [pos_x + 1, pos_y + a + 1],
115
+ [pos_x + a + 1, pos_y + a + 1],
116
+ [pos_x + a + 1, pos_y + 1]
117
+ end
118
+
119
+ group(id: 'heart') do
120
+ polygon [pos_x + a, pos_y + a],
121
+ [pos_x + b - d, pos_y + a],
122
+ [pos_x + b, pos_y + b - d],
123
+ [pos_x + b + d, pos_y + a],
124
+ [pos_x + c, pos_y + a],
125
+ [pos_x + c, pos_y + b],
126
+ [pos_x + b, pos_y + c],
127
+ [pos_x + a, pos_y + b]
128
+ end
129
+ end
130
+
131
+ # grid
132
+ group stroke: 'black' do
133
+ for line_data in rasem_obj.grid
134
+ line line_data[0], line_data[1], line_data[2], line_data[3], :stroke_width=>line_data[5]
135
+ end
136
+
137
+ blocks = rasem_obj.width / 10
138
+ blocks.times do |i|
139
+ text((i + 1) * 10 * px + b, c, stroke_width: 1, 'font-size': '8px', class: 'grid-numbers') { raw (i + 1) * 10 }
140
+ text(1, (i + 1) * 10 * px + px + a, stroke_width: 1, 'font-size': '8px', class: 'grid-numbers') { raw (i + 1) * 10 }
141
+ end
142
+ end
143
+
144
+ # content
145
+ for pixel in rasem_obj.px_arr
146
+ use(pixel.shape, x: rasem_obj.pos_x - px, y: rasem_obj.pos_y - px, fill: pixel.hex)
68
147
  rasem_obj.update_positions
69
148
  end
149
+
150
+ # legend
151
+ group stroke: 'black' do
152
+ legend_pos_x = (rasem_obj.width + 2) * px
153
+ legend_pos_y = 2 * px
154
+ legend_height = px * (rasem_obj.color_set.length * 2)
155
+ rectangle legend_pos_x, legend_pos_y, 10 * px, legend_height, fill: 'white'
156
+ rasem_obj.color_set.each_with_index do |pixel, index|
157
+ use(pixel.shape, x: legend_pos_x - b, y: legend_pos_y - b, fill: pixel.hex)
158
+ text(legend_pos_x + 2 * px, legend_pos_y + px + b) { raw pixel.hex }
159
+ legend_pos_y += 2 * px
160
+ end
161
+ end
70
162
  end
71
163
  end
72
164
 
@@ -39,26 +39,24 @@ class Pixelfy
39
39
  "#{HSL_OPEN_CONST} #{self.hue}, #{self.saturation}%, #{self.lightness}%, 1)"
40
40
  end
41
41
 
42
+ def name
43
+ n = ''
44
+ c = Chroma::Color.new(hsl).to_name
45
+ n = c unless c == "<unknown>"
46
+
47
+ end
48
+
42
49
  def colorize(map)
43
50
  deltae = 100000000000
44
51
  closest_px = map[0]
45
52
 
46
53
  map.each do |dom_px|
47
- hue_delta = (dom_px.hue - self.hue).abs
48
-
49
- if hue_delta < deltae
50
-
51
- deltae = hue_delta
52
- closest_px = dom_px
53
-
54
- elsif hue_delta == deltae
55
- dom_px_delta = self.get_full_delta(dom_px)
56
- current_px_delta = self.get_full_delta(closest_px)
57
- if dom_px_delta < current_px_delta
58
- deltae = hue_delta
59
- closest_px = dom_px
60
- end
61
- end
54
+ dom_px_delta = self.get_delta_e(dom_px)
55
+ current_px_delta = self.get_delta_e(closest_px)
56
+ if dom_px_delta < current_px_delta
57
+ deltae = dom_px_delta
58
+ closest_px = dom_px
59
+ end
62
60
  end
63
61
 
64
62
  self.hue = closest_px.hue
@@ -69,7 +67,7 @@ class Pixelfy
69
67
  self
70
68
  end
71
69
 
72
- def get_full_delta(px)
70
+ def get_delta_e(px)
73
71
  hue_delta = (px.hue - self.hue).abs
74
72
  sat_delta = (px.saturation - self.saturation).abs
75
73
  lit_delta = (px.lightness - self.lightness).abs
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stitchify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ellen Wondra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-23 00:00:00.000000000 Z
11
+ date: 2020-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rasem
@@ -56,60 +56,60 @@ dependencies:
56
56
  name: chroma
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 0.2.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 0.2.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rmagick
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '2.16'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '2.16'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 12.3.1
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 12.3.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pry
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: '0'
103
+ version: 0.11.3
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: '0'
111
- description: ultimate goal is to input an HTML document and output an SVG cross stitching
112
- pattern
110
+ version: 0.11.3
111
+ description: takes a .jpg image and converts it to an SVG cross stitching pattern.
112
+ You can change the colors, the width, and the number of colors used.
113
113
  email: ellenfromillinois@gmail.com
114
114
  executables: []
115
115
  extensions: []