pixel_curtain 0.0.3 → 0.0.12

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.
data/Gemfile CHANGED
@@ -1,6 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in pixel_curtain.gemspec
4
- gemspec
5
-
6
- gem 'chunky_png'
4
+ gemspec
@@ -4,11 +4,12 @@ dir = File.expand_path(File.dirname(__FILE__))
4
4
  require dir + '/../lib/pixel_curtain'
5
5
 
6
6
  input_file = ARGV[0]
7
+ output_file = "#{File.basename(input_file, ".*")}-output.png"
7
8
 
8
9
  if input_file.nil?
9
10
  puts "input file required"
10
11
  else
11
- curtain = PixelCurtain::Curtain.new(input_file)
12
- curtain.process(20)
13
- curtain.save("output.png")
12
+ curtain = PixelCurtain::SimpleCurtain.new(input_file)
13
+ curtain.process(:number_of_divisions => rand(20)+5)
14
+ curtain.save(output_file)
14
15
  end
@@ -1,6 +1,6 @@
1
- require 'chunky_png'
2
-
3
1
  dir = File.expand_path(File.dirname(__FILE__))
2
+ require dir + '/pixel_curtain/curtain'
3
+ require dir + '/pixel_curtain/simple_curtain'
4
+ require dir + '/pixel_curtain/complex_curtain'
4
5
 
5
- require dir + '/pixel_curtain/image'
6
- require dir + '/pixel_curtain/curtain'
6
+ PixelCurtain::SimpleCurtain
@@ -0,0 +1,3 @@
1
+ class ComplexCurtain
2
+
3
+ end
@@ -1,30 +1,53 @@
1
- module PixelCurtain
1
+ require 'rubygems'
2
+ require 'RMagick'
3
+
4
+ module PixelCurtain
2
5
  class Curtain
3
- def initialize(file_name)
4
- @source_image = ChunkyPNG::Image.from_file(file_name)
5
- @output = ChunkyPNG::Image.new(1440,900)
6
+ include Magick
7
+ def initialize(file_path)
8
+ @source_image = Image.read(file_path).first
9
+ @output = Image.new(1440,900)
6
10
  end
7
11
 
8
- def process(number_of_divisions=10)
9
-
10
- if (number_of_divisions > @source_image.dimension.width)
11
- number_of_divisions = @source_image.dimension.width
12
- end
13
-
14
- source_division_size = @source_image.dimension.width / number_of_divisions
15
- destination_division_size = @output.dimension.width / number_of_divisions
16
-
17
- (0...number_of_divisions).each do |x|
18
- avgPixel = @source_image.crop(source_division_size*x,0,
19
- source_division_size,@source_image.dimension.height).average_pixel
20
- @output.setPixelBlock(x*destination_division_size,0,@output.dimension.height,destination_division_size,avgPixel)
21
- end
22
- @output
12
+ # Do nothing, this is to be implemented by subclasses
13
+ def process(options = {})
14
+ @output
23
15
  end
24
16
 
25
- def save(file_name)
26
- @output.save(file_name)
17
+ def save(file_name, options = {})
18
+
19
+ options[:temp_file] = false if options[:temp_file].nil?
20
+
21
+ if options[:temp_file]
22
+ output_file = Tempfile.new(['pixel_curtain', 'png'])
23
+ else
24
+ output_file = File.new(file_name, 'w')
25
+ end
26
+
27
+ @output.write("png:" + output_file.path)
28
+
29
+ return output_file
27
30
  end
28
31
 
32
+ private
33
+
34
+ def average_color(image)
35
+ total = 0
36
+ avg = { :r => 0.0, :g => 0.0, :b => 0.0 }
37
+
38
+ image.quantize.color_histogram.each do |c,n|
39
+ avg[:r] += n * c.red
40
+ avg[:g] += n * c.green
41
+ avg[:b] += n * c.blue
42
+ total += n
43
+ end
44
+
45
+ avg.each_key do |c|
46
+ avg[c] /= total
47
+ avg[c] = (avg[c] / QuantumRange * 255).to_i
48
+ end
49
+
50
+ return "rgb(#{avg[:r]},#{avg[:g]},#{avg[:b]})"
51
+ end
29
52
  end
30
53
  end
@@ -0,0 +1,31 @@
1
+ module PixelCurtain
2
+ class SimpleCurtain < Curtain
3
+ def process(options = {})
4
+
5
+ if options[:number_of_divisions].nil?
6
+ number_of_divisions = 10
7
+ else
8
+ number_of_divisions = options[:number_of_divisions]
9
+ end
10
+
11
+ if (number_of_divisions > @source_image.columns)
12
+ number_of_divisions = @source_image.columns
13
+ end
14
+
15
+ source_division_size = @source_image.columns / number_of_divisions
16
+ destination_division_size = @output.columns / number_of_divisions
17
+
18
+ gc = Draw.new
19
+
20
+ (0...number_of_divisions).each do |x|
21
+ avgPixel = average_color(@source_image.crop(source_division_size*x,0,
22
+ source_division_size,@source_image.rows))
23
+ gc.fill(avgPixel)
24
+ gc.rectangle(x*destination_division_size,0,x*destination_division_size+destination_division_size,@output.rows)
25
+ gc.draw(@output)
26
+ end
27
+
28
+ @output
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module PixelCurtain
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.12"
3
3
  end
@@ -18,4 +18,6 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
+ s.add_dependency(%q<rmagick>, [">= 2.12.2"])
22
+
21
23
  end
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pixel_curtain
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 7
4
5
  prerelease:
5
- version: 0.0.3
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 12
10
+ version: 0.0.12
6
11
  platform: ruby
7
12
  authors:
8
13
  - Nick Rowe
@@ -10,10 +15,25 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-06-28 00:00:00 -07:00
18
+ date: 2011-07-10 00:00:00 -07:00
14
19
  default_executable:
15
- dependencies: []
16
-
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rmagick
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 59
30
+ segments:
31
+ - 2
32
+ - 12
33
+ - 2
34
+ version: 2.12.2
35
+ type: :runtime
36
+ version_requirements: *id001
17
37
  description: Generate beautiful backgrounds from images
18
38
  email:
19
39
  - nixterrimus@dcxn.com
@@ -30,8 +50,9 @@ files:
30
50
  - Rakefile
31
51
  - bin/pixel_curtain
32
52
  - lib/pixel_curtain.rb
53
+ - lib/pixel_curtain/complex_curtain.rb
33
54
  - lib/pixel_curtain/curtain.rb
34
- - lib/pixel_curtain/image.rb
55
+ - lib/pixel_curtain/simple_curtain.rb
35
56
  - lib/pixel_curtain/version.rb
36
57
  - pixel_curtain.gemspec
37
58
  has_rdoc: true
@@ -48,12 +69,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
48
69
  requirements:
49
70
  - - ">="
50
71
  - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
51
75
  version: "0"
52
76
  required_rubygems_version: !ruby/object:Gem::Requirement
53
77
  none: false
54
78
  requirements:
55
79
  - - ">="
56
80
  - !ruby/object:Gem::Version
81
+ hash: 3
82
+ segments:
83
+ - 0
57
84
  version: "0"
58
85
  requirements: []
59
86
 
@@ -1,23 +0,0 @@
1
- class ChunkyPNG::Image
2
- def average_pixel
3
- # Sum the total R, G, and B pieces
4
- ave = self.pixels.inject([0,0,0]) do |sum,element|
5
- sum[0] += ChunkyPNG::Color.r(element)
6
- sum[1] += ChunkyPNG::Color.g(element)
7
- sum[2] += ChunkyPNG::Color.b(element)
8
- sum
9
- end
10
- # Cache the pixel_count value for speed
11
- pixel_count = self.pixels.count
12
- # Return the average value of each component as a new Color
13
- ChunkyPNG::Color.rgb(ave[0] / pixel_count, ave[1] / pixel_count, ave[2] / pixel_count)
14
- end
15
-
16
- def setPixelBlock(startX, startY, height, width, newPixel)
17
- (startX...startX+width).each do |x|
18
- (startY...startY+height).each do |y|
19
- self[x,y] = newPixel
20
- end
21
- end
22
- end
23
- end