svg_profiler 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +3 -11
- data/lib/svg_profiler.rb +1 -0
- data/lib/svg_profiler/base.rb +3 -2
- data/lib/svg_profiler/histogram.rb +33 -9
- metadata +24 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 403478f11dec0b9d0c87c8446fc723c0b40014a2
|
4
|
+
data.tar.gz: 60c06392446473c358969008666e971377493260
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6d18996cd7623910260042b1238d98119c0b7a01637b10fdefee528fb36add99263d96d674e7ac9710bc121f22588a2e69d71b46bcc8bdcf260896863419c97d
|
7
|
+
data.tar.gz: 1fe9346efa9380632229012c407079c36e991222c1893575982519d0516c641ef06352b2b6b48d0a3f493df9fad60e57fe7c6a7be3500df59c18199c2f4ead74
|
data/README.md
CHANGED
@@ -28,21 +28,13 @@ profile.height
|
|
28
28
|
profile.aspect
|
29
29
|
#=> 1.5
|
30
30
|
|
31
|
-
|
32
|
-
profile.colors
|
31
|
+
profile.histogram
|
33
32
|
#=> { "#FF0000" => 0.7, "#FFFFFF" => 0.29, "#000000" => 0.01 }
|
34
33
|
```
|
35
34
|
|
36
|
-
|
35
|
+
When calculating the histogram, the SVG is rasterized to a PNG and anti-aliased.
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
```ruby
|
41
|
-
profile.colors(0.02)
|
42
|
-
#=> { "#FF0000" => 0.7070707070707071, "#FFFFFF" => 0.29292929292929293 }
|
43
|
-
```
|
44
|
-
|
45
|
-
The sum of the values in the hash will always add up to one.
|
37
|
+
This may have a small impact on the color ratios.
|
46
38
|
|
47
39
|
## Contribution
|
48
40
|
|
data/lib/svg_profiler.rb
CHANGED
data/lib/svg_profiler/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class SVGProfiler
|
2
2
|
|
3
3
|
def initialize(xml_string)
|
4
|
+
@xml_string = xml_string
|
4
5
|
@inkscape = Inkscape.new(xml_string)
|
5
6
|
end
|
6
7
|
|
@@ -20,8 +21,8 @@ class SVGProfiler
|
|
20
21
|
width.to_f / height
|
21
22
|
end
|
22
23
|
|
23
|
-
def histogram
|
24
|
-
@inkscape.yield_png { |png| Histogram.for(
|
24
|
+
def histogram
|
25
|
+
@inkscape.yield_png { |png| Histogram.for(@xml_string, png) }
|
25
26
|
end
|
26
27
|
|
27
28
|
end
|
@@ -1,15 +1,18 @@
|
|
1
1
|
class SVGProfiler::Histogram
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
WARN_THRESHOLD = 0.02
|
4
|
+
|
5
|
+
def self.for(xml_string, png)
|
6
|
+
new(xml_string, png).histogram
|
5
7
|
end
|
6
8
|
|
7
|
-
def initialize(png)
|
9
|
+
def initialize(xml_string, png)
|
8
10
|
check_for_imagemagick
|
9
11
|
@image = Magick::Image.read(png.path).first
|
12
|
+
@palette = SVGPalette.parse(xml_string)
|
10
13
|
end
|
11
14
|
|
12
|
-
def histogram
|
15
|
+
def histogram
|
13
16
|
@image.quantize(8) # 00-FF is 8-bits.
|
14
17
|
|
15
18
|
histogram = @image.color_histogram
|
@@ -17,11 +20,8 @@ class SVGProfiler::Histogram
|
|
17
20
|
hash.merge(to_hex(p) => f)
|
18
21
|
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# Re-normalize after thresholding.
|
24
|
-
normalize(ratios)
|
23
|
+
filter_by_palette!(frequencies)
|
24
|
+
normalize(frequencies)
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
@@ -38,6 +38,30 @@ class SVGProfiler::Histogram
|
|
38
38
|
pixel.to_color(Magick::AllCompliance, false, 8, true)
|
39
39
|
end
|
40
40
|
|
41
|
+
# When the png is created, it gets anti-aliased.
|
42
|
+
# If it is down-sampled, you'll end up with many midway colors.
|
43
|
+
# These have a negligible pixel count and could be thresholded out.
|
44
|
+
# This seems like a better approach, assuming the palette is correct.
|
45
|
+
def filter_by_palette!(hash)
|
46
|
+
hex_codes = @palette.map(&:html)
|
47
|
+
pre_filter = normalize(hash)
|
48
|
+
|
49
|
+
hash.reject! do |k, v|
|
50
|
+
if !hex_codes.include?(k.downcase)
|
51
|
+
warn_if_filtering_a_prominent_color(k, pre_filter)
|
52
|
+
true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def warn_if_filtering_a_prominent_color(hex, normalized)
|
58
|
+
if normalized[hex] > WARN_THRESHOLD
|
59
|
+
puts "\n#{__FILE__}:#{__LINE__}"
|
60
|
+
puts "WARNING: '#{hex}' was been assumed to be an artifact of anti-aliasing when perhaps it was not."
|
61
|
+
puts "Please email your SVG to chris@patuzzo.co.uk, with a subject of `SVG Filter Threshold'."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
41
65
|
def normalize(frequencies)
|
42
66
|
sum = frequencies.values.inject(:+)
|
43
67
|
frequencies.inject({}) do |hash, (k, v)|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svg_profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Chris Patuzzo
|
@@ -14,33 +13,43 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rmagick
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: svg_palette
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
28
39
|
- !ruby/object:Gem::Version
|
29
40
|
version: '0'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: rspec
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - '>='
|
36
46
|
- !ruby/object:Gem::Version
|
37
47
|
version: '0'
|
38
48
|
type: :development
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - '>='
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: '0'
|
46
55
|
description: Profiles a Scalable Vector Graphics xml string.
|
@@ -56,27 +65,25 @@ files:
|
|
56
65
|
- lib/svg_profiler.rb
|
57
66
|
homepage: https://github.com/cpatuzzo/svg_profiler
|
58
67
|
licenses: []
|
68
|
+
metadata: {}
|
59
69
|
post_install_message:
|
60
70
|
rdoc_options: []
|
61
71
|
require_paths:
|
62
72
|
- lib
|
63
73
|
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
-
none: false
|
65
74
|
requirements:
|
66
|
-
- -
|
75
|
+
- - '>='
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '0'
|
69
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
79
|
requirements:
|
72
|
-
- -
|
80
|
+
- - '>='
|
73
81
|
- !ruby/object:Gem::Version
|
74
82
|
version: '0'
|
75
83
|
requirements: []
|
76
84
|
rubyforge_project:
|
77
|
-
rubygems_version:
|
85
|
+
rubygems_version: 2.0.0
|
78
86
|
signing_key:
|
79
|
-
specification_version:
|
87
|
+
specification_version: 4
|
80
88
|
summary: SVG Profiler
|
81
89
|
test_files: []
|
82
|
-
has_rdoc:
|