pixelholder 1.2.3 → 2.0.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 +4 -4
- data/lib/pixelholder.rb +5 -158
- data/lib/pixelholder/base.rb +78 -0
- data/lib/pixelholder/fill.rb +6 -0
- data/lib/pixelholder/flickr.rb +52 -0
- data/lib/pixelholder/gradient.rb +22 -0
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 420138d75edecfce1cfd55e625ab142ed917b9ef
|
4
|
+
data.tar.gz: 09503b49fd4499af8570f588a8c39344d225218c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eba31db1645f3b19da4d822850ca414ec69f62547e44793156101386fd06d5dce610c7479599e11910fac240a5a97bb07f484607790ec85a49ff908216e304bf
|
7
|
+
data.tar.gz: 2d4fbe873c8c1743cc21d887d3393b51bca01ab98144ae78883b3d61dbcaf79c78917b4fabaa8674c47f09a864c0f03da09b835f4ba7cb11cfc16f6fa794bac4
|
data/lib/pixelholder.rb
CHANGED
@@ -1,161 +1,8 @@
|
|
1
1
|
# pixelholder.rb
|
2
2
|
|
3
|
-
require
|
4
|
-
require 'flickr_fu'
|
5
|
-
require 'RMagick'
|
3
|
+
require "rubygems"
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# In case we ever decide to allow extra formats for whatever reason
|
12
|
-
@image_format = extra_options[:image_format] ? extra_options[:image_format] : 'jpg'
|
13
|
-
|
14
|
-
# Set image dimensions values
|
15
|
-
if is_numeric(dimensions)
|
16
|
-
@width = @height = dimensions.to_i
|
17
|
-
else
|
18
|
-
dimensions = dimensions.downcase.split('x')
|
19
|
-
default_dimension = 200
|
20
|
-
|
21
|
-
@width = dimensions[0].to_i
|
22
|
-
|
23
|
-
if dimensions[1].nil? then @height = @width
|
24
|
-
else
|
25
|
-
@height = dimensions[1].to_i
|
26
|
-
if(@height == 0) then @height = default_dimension end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Create image with background
|
31
|
-
subject = subject.downcase.split(':')
|
32
|
-
background_type = subject[0] if subject.length > 1
|
33
|
-
|
34
|
-
case background_type
|
35
|
-
when 'color'
|
36
|
-
generate_canvas(subject[1])
|
37
|
-
when 'gradient'
|
38
|
-
gradient_colors = subject[1].split(',')
|
39
|
-
|
40
|
-
if gradient_colors[2].nil? || gradient_colors[2] == 'v'
|
41
|
-
end_x = @width
|
42
|
-
end_y = 0
|
43
|
-
else
|
44
|
-
end_x = 0
|
45
|
-
end_y = @height
|
46
|
-
end
|
47
|
-
|
48
|
-
fill_content = Magick::GradientFill.new(0, 0, end_x, end_y, get_hex(gradient_colors[0]), get_hex(gradient_colors[1]))
|
49
|
-
|
50
|
-
generate_canvas('000', fill_content)
|
51
|
-
else
|
52
|
-
seed = extra_options[:seed] ? extra_options[:seed].to_i : 0
|
53
|
-
|
54
|
-
flickr_config_path = flickr_config_path ? flickr_config_path : 'config/flickr.yml'
|
55
|
-
|
56
|
-
flickr = Flickr.new(flickr_config_path)
|
57
|
-
|
58
|
-
# Grab all images with Creative Commons licencing
|
59
|
-
photos = flickr.photos.search(:tags => subject[0], :tag_mode => 'all', :license => '4,5,6,7', :media => 'photo')
|
60
|
-
photo = photos[seed]
|
61
|
-
|
62
|
-
generate_canvas()
|
63
|
-
|
64
|
-
unless photo.nil?
|
65
|
-
image_background = Magick::ImageList.new
|
66
|
-
image_url = open(photo.url(:large))
|
67
|
-
image_format = @image_format
|
68
|
-
|
69
|
-
# Read the Flickr image as a blob
|
70
|
-
image_background.from_blob(image_url.read) do
|
71
|
-
self.format = image_format
|
72
|
-
self.quality = 100
|
73
|
-
end
|
74
|
-
|
75
|
-
# Make the image meet the dimensions
|
76
|
-
image_background.resize_to_fill!(@width, @height)
|
77
|
-
@canvas.composite!(image_background, Magick::CenterGravity, Magick::CopyCompositeOp)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# Text overlay
|
82
|
-
if extra_options[:text]
|
83
|
-
generate_overlay_text(extra_options[:text], extra_options[:text_color])
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
# Test if a value is numeric
|
89
|
-
def is_numeric(value)
|
90
|
-
true if Integer(value) rescue false
|
91
|
-
end
|
92
|
-
|
93
|
-
# Returns a blob string of the generated image
|
94
|
-
def get_blob
|
95
|
-
@canvas.to_blob
|
96
|
-
end
|
97
|
-
|
98
|
-
# Returns a hex color code
|
99
|
-
def get_hex(color)
|
100
|
-
"##{generate_color(color).downcase}"
|
101
|
-
end
|
102
|
-
|
103
|
-
# Returns the appropriate color code string
|
104
|
-
def generate_color(color)
|
105
|
-
return color.ljust(6, color) if (1..2).include?(color.length)
|
106
|
-
return color.scan(/((.))/).flatten.join if color.length == 3
|
107
|
-
return color.ljust(6, '0') if (4..5).include?(color.length)
|
108
|
-
return color[0..5] if color.length > 6
|
109
|
-
return color
|
110
|
-
end
|
111
|
-
|
112
|
-
# Generates an Imagick canvas
|
113
|
-
def generate_canvas(background = '000', fill_content = nil)
|
114
|
-
background = get_hex(background)
|
115
|
-
image_format = @image_format
|
116
|
-
|
117
|
-
if fill_content.nil?
|
118
|
-
@canvas = Magick::Image.new(@width, @height) do
|
119
|
-
self.background_color = background
|
120
|
-
self.format = image_format
|
121
|
-
end
|
122
|
-
else
|
123
|
-
@canvas = Magick::Image.new(@width, @height, fill_content) do
|
124
|
-
self.format = image_format
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
# Add a text overlay to the image
|
130
|
-
def generate_overlay_text(string, color = false)
|
131
|
-
if string == 'add_dimensions' then string = "#{@width} #{215.chr} #{@height}" end
|
132
|
-
|
133
|
-
overlay_text = string
|
134
|
-
overlay = Magick::Draw.new
|
135
|
-
|
136
|
-
overlay.fill = color ? get_hex(color) : get_hex('fff')
|
137
|
-
overlay.stroke = "rgba(0,0,0,0.15)"
|
138
|
-
overlay.stroke_width = 20
|
139
|
-
overlay.font_weight = Magick::BoldWeight
|
140
|
-
overlay.pointsize = 500
|
141
|
-
overlay.gravity = Magick::CenterGravity
|
142
|
-
overlay.interline_spacing = -500
|
143
|
-
|
144
|
-
font_size = overlay.get_type_metrics(overlay_text)
|
145
|
-
|
146
|
-
overlay_canvas = Magick::Image.new(font_size.width, font_size.height) do
|
147
|
-
self.background_color = 'transparent'
|
148
|
-
end
|
149
|
-
|
150
|
-
overlay.annotate(overlay_canvas, 0, 0, 0, 0, overlay_text)
|
151
|
-
|
152
|
-
overlay_height = @height * 0.8
|
153
|
-
|
154
|
-
overlay_canvas.resize_to_fit!(@width * 0.8, overlay_height)
|
155
|
-
|
156
|
-
@canvas.composite!(overlay_canvas, Magick::CenterGravity, Magick::OverCompositeOp)
|
157
|
-
end
|
158
|
-
|
159
|
-
private :generate_canvas, :generate_overlay_text
|
160
|
-
|
161
|
-
end
|
5
|
+
require "pixelholder/base"
|
6
|
+
require "pixelholder/fill"
|
7
|
+
require "pixelholder/gradient"
|
8
|
+
require "pixelholder/flickr"
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require "RMagick"
|
2
|
+
|
3
|
+
module PixelHolder
|
4
|
+
def self.base
|
5
|
+
Base.new
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class PixelHolder::Base
|
10
|
+
|
11
|
+
attr_reader :canvas, :width, :height, :image_format
|
12
|
+
|
13
|
+
def initialize(options = {})
|
14
|
+
@options = options
|
15
|
+
set_options
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def set_options
|
21
|
+
@width = @options[:width].to_i || 800
|
22
|
+
@height = @options[:height].to_i || 600
|
23
|
+
@image_format = @options[:image_format] || "jpg"
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate_canvas(fill = nil)
|
27
|
+
background_color = @options[:background_color] || "#ffffff"
|
28
|
+
image_format = @image_format
|
29
|
+
|
30
|
+
unless fill.nil?
|
31
|
+
@canvas = Magick::Image.new(@width, @height, fill) do
|
32
|
+
self.background_color = background_color
|
33
|
+
self.format = image_format
|
34
|
+
end
|
35
|
+
else
|
36
|
+
@canvas = Magick::Image.new(@width, @height) do
|
37
|
+
self.background_color = background_color
|
38
|
+
self.format = image_format
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
add_text_overlay
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_text_overlay
|
46
|
+
unless @options[:text].nil?
|
47
|
+
if @options[:text] == "show_dimensions"
|
48
|
+
overlay_text = "#{@width} #{215.chr} #{@height}"
|
49
|
+
else
|
50
|
+
overlay_text = @options[:text]
|
51
|
+
end
|
52
|
+
|
53
|
+
overlay = Magick::Draw.new
|
54
|
+
|
55
|
+
overlay.fill = @options[:text_color] || '#ffffff'
|
56
|
+
overlay.stroke = "rgba(0,0,0,0.15)"
|
57
|
+
overlay.stroke_width = 20
|
58
|
+
overlay.font_weight = Magick::BoldWeight
|
59
|
+
overlay.pointsize = 500
|
60
|
+
overlay.gravity = Magick::CenterGravity
|
61
|
+
overlay.interline_spacing = -500
|
62
|
+
|
63
|
+
font_size = overlay.get_type_metrics(overlay_text)
|
64
|
+
|
65
|
+
overlay_canvas = Magick::Image.new(font_size.width, font_size.height) do
|
66
|
+
self.background_color = 'transparent'
|
67
|
+
end
|
68
|
+
|
69
|
+
overlay.annotate(overlay_canvas, 0, 0, 0, 0, overlay_text)
|
70
|
+
|
71
|
+
overlay_height = @height * 0.8
|
72
|
+
|
73
|
+
overlay_canvas.resize_to_fit!(@width * 0.8, overlay_height)
|
74
|
+
|
75
|
+
@canvas.composite!(overlay_canvas, Magick::CenterGravity, Magick::OverCompositeOp)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'flickraw'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
class PixelHolder::Flickr < PixelHolder::Base
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def set_options
|
9
|
+
super
|
10
|
+
add_photo
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_photo
|
14
|
+
seed = if @options[:seed] then @options[:seed].to_i else 0 end
|
15
|
+
|
16
|
+
FlickRaw.api_key = @options[:flickr_key]
|
17
|
+
FlickRaw.shared_secret = @options[:flickr_secret]
|
18
|
+
|
19
|
+
photos = flickr.photos.search(
|
20
|
+
tags: @options[:flickr_tags],
|
21
|
+
tag_mode: 'all'
|
22
|
+
)
|
23
|
+
|
24
|
+
photo_id = photos[seed].id
|
25
|
+
photo_sizes = flickr.photos.getSizes(photo_id: photo_id)
|
26
|
+
|
27
|
+
# Get the largest image
|
28
|
+
photo_original_url = photo_sizes[-1].source
|
29
|
+
|
30
|
+
unless photo_original_url.nil?
|
31
|
+
image_background = Magick::ImageList.new
|
32
|
+
image_url = open(photo_original_url)
|
33
|
+
image_format = @image_format
|
34
|
+
|
35
|
+
image_background.from_blob(image_url.read) do
|
36
|
+
self.format = image_format
|
37
|
+
self.quality = 100
|
38
|
+
end
|
39
|
+
|
40
|
+
image_background.resize_to_fill!(@width, @height)
|
41
|
+
|
42
|
+
generate_canvas
|
43
|
+
|
44
|
+
@canvas.composite!(image_background, Magick::CenterGravity, Magick::CopyCompositeOp)
|
45
|
+
end
|
46
|
+
|
47
|
+
if @options[:text]
|
48
|
+
add_text_overlay
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class PixelHolder::Gradient < PixelHolder::Base
|
2
|
+
|
3
|
+
private
|
4
|
+
|
5
|
+
def set_options
|
6
|
+
super
|
7
|
+
add_gradient
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_gradient
|
11
|
+
direction = @options[:direction] || "vertical"
|
12
|
+
start_color = @options[:start_color] || "#ffffff"
|
13
|
+
end_color = @options[:end_color] || "#0099cc"
|
14
|
+
|
15
|
+
end_x = if direction == "vertical" then @width else 0 end
|
16
|
+
end_y = if direction == "vertical" then 0 else @height end
|
17
|
+
|
18
|
+
fill = Magick::GradientFill.new(0, 0, end_x, end_y, start_color, end_color)
|
19
|
+
|
20
|
+
generate_canvas(fill)
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pixelholder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Dingli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: flickraw
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.9.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.9.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rmagick
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,6 +45,10 @@ extensions: []
|
|
45
45
|
extra_rdoc_files: []
|
46
46
|
files:
|
47
47
|
- lib/pixelholder.rb
|
48
|
+
- lib/pixelholder/base.rb
|
49
|
+
- lib/pixelholder/fill.rb
|
50
|
+
- lib/pixelholder/flickr.rb
|
51
|
+
- lib/pixelholder/gradient.rb
|
48
52
|
homepage: http://github.com/chrisdingli/pixelholder-rubygem
|
49
53
|
licenses:
|
50
54
|
- MIT
|