pnm 0.1.0 → 0.2.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: e0626fcd5c88b2477eb1f76891857c83fb10d881
4
- data.tar.gz: 29724fe5ca19969bb9bf66358272222189b17f33
3
+ metadata.gz: d185b233565cd87cea47d7a47fa8cd53cbd3120d
4
+ data.tar.gz: 65754714716d6b399cc8950e0ff90584cb42485a
5
5
  SHA512:
6
- metadata.gz: 9e1f19e832e56b253d9db10794d4b414fc0211222c8e24ac572ffa93399e505bab04648b51ad1598916959480e2769fbac6f74253557f8a2a2ec81fca06aab8f
7
- data.tar.gz: de73725df2c7703abd73e105ea770c4efe89d5db7caa01da45a747335a3d819003a946a8aaa31aa08869e0a8a6662e578cd23227d31daab00eabc686ac86e0ef
6
+ metadata.gz: 0737d6700d5ce343d0e326006213640eebe097181a47e3d99a70610a4f4aed95765a2fc1ccbee7b767177a9279224ef5814ee4fd53891a9de9b1eb0b9ca8a131
7
+ data.tar.gz: 2633bcdac0cf6fae08e3c36a9a81a6af985712273a9dc5361824794713c778300f12fa5ebee86eff5a34a7bf8bc4f38b4287f4e97887f3ca5685ea447c4d607f
data/README.md CHANGED
@@ -13,50 +13,62 @@ Examples
13
13
 
14
14
  Create a PGM grayscale image from a two-dimensional array of gray values:
15
15
 
16
- require 'pnm'
16
+ ``` ruby
17
+ require 'pnm'
17
18
 
18
- # pixel data
19
- pixels = [[ 0, 10, 20],
20
- [10, 20, 30]]
19
+ # pixel data
20
+ pixels = [[ 0, 10, 20],
21
+ [10, 20, 30]]
21
22
 
22
- # optional settings
23
- options = {:maxgray => 30, :comment => 'Test Image'}
23
+ # optional settings
24
+ options = {:maxgray => 30, :comment => 'Test Image'}
24
25
 
25
- # create the image object
26
- image = PNM::Image.new(:pgm, pixels, options)
26
+ # create the image object
27
+ image = PNM::Image.new(pixels, options)
27
28
 
28
- # retrieve some image properties
29
- image.info # => "PGM 3x2 Grayscale"
30
- image.width # => 3
31
- image.height # => 2
29
+ # retrieve some image properties
30
+ image.info # => "PGM 3x2 Grayscale"
31
+ image.width # => 3
32
+ image.height # => 2
33
+ ```
32
34
 
33
35
  See PNM::Image.new for a more detailed description of pixel data formats
34
36
  and available options.
35
37
 
36
38
  Write an image to a file:
37
39
 
38
- image.write('test.pgm')
40
+ ``` ruby
41
+ image.write('test.pgm')
39
42
 
40
- # use ASCII or "plain" format (default is binary)
41
- image.write('test.pgm', :ascii)
43
+ # use ASCII or "plain" format (default is binary)
44
+ image.write('test.pgm', :ascii)
42
45
 
43
- # write to an I/O stream
44
- File.open('test.pgm', 'w') {|f| image.write(f) }
46
+ # write to an I/O stream
47
+ File.open('test.pgm', 'w') {|f| image.write(f) }
48
+ ```
45
49
 
46
50
  Read an image from a file (returns a PNM::Image object):
47
51
 
48
- image = PNM.read('test.pgm')
49
- image.comment # => "Test Image"
50
- image.maxgray # => 30
51
- image.pixels # => [[0, 10, 20], [10, 20, 30]]
52
+ ``` ruby
53
+ image = PNM.read('test.pgm')
54
+ image.comment # => "Test Image"
55
+ image.maxgray # => 30
56
+ image.pixels # => [[0, 10, 20], [10, 20, 30]]
57
+ ```
52
58
 
59
+ Force an image type:
60
+
61
+ ``` ruby
62
+ image = PNM::Image.new([[0, 1],[1, 0]], :type => :ppm)
63
+ image.info # => "PPM 2x2 Color"
64
+ ```
53
65
 
54
66
  Installation
55
67
  ------------
56
68
 
57
69
  To install PNM, you can either
58
70
 
59
- - use `gem install pnm`, or
71
+ - use `gem install pnm` to install from RubyGems.org,
60
72
 
61
73
  - clone or download the repository and use
62
74
  `rake build` and `[sudo] gem install pnm`.
@@ -66,8 +78,12 @@ Requirements
66
78
 
67
79
  - No additional Ruby gems or native libraries are needed.
68
80
 
69
- - PNM has been tested with Ruby 1.9.3 and Ruby 2.0.0
70
- on Linux and on Windows.
81
+ - PNM has been tested with
82
+
83
+ - Ruby 2.0.0 on Linux and on Windows,
84
+ - Ruby 1.9.3,
85
+ - JRuby 1.7.8,
86
+ - Rubinius 2.2.1.
71
87
 
72
88
  Documentation
73
89
  -------------
@@ -5,7 +5,6 @@
5
5
 
6
6
  require 'benchmark'
7
7
  require_relative '../lib/pnm'
8
- require_relative '../lib/pnm/converter'
9
8
 
10
9
  class ConverterBenchmark
11
10
 
data/lib/pnm.rb CHANGED
@@ -29,7 +29,7 @@ require_relative 'pnm/converter'
29
29
  # options = {:maxgray => 30, :comment => 'Test Image'}
30
30
  #
31
31
  # # create the image object
32
- # image = PNM::Image.new(:pgm, pixels, options)
32
+ # image = PNM::Image.new(pixels, options)
33
33
  #
34
34
  # # retrieve some image properties
35
35
  # image.info # => "PGM 3x2 Grayscale"
@@ -56,6 +56,11 @@ require_relative 'pnm/converter'
56
56
  # image.maxgray # => 30
57
57
  # image.pixels # => [[0, 10, 20], [10, 20, 30]]
58
58
  #
59
+ # Force an image type:
60
+ #
61
+ # image = PNM::Image.new([[0, 1],[1, 0]], :type => :ppm)
62
+ # image.info # => "PPM 2x2 Color"
63
+ #
59
64
  # == See also
60
65
  #
61
66
  # Further information on the PNM library is available on the
@@ -139,10 +144,10 @@ module PNM
139
144
  Converter.binary2array(type, width, height, content[:data])
140
145
  end
141
146
 
142
- options = {:maxgray => maxgray}
147
+ options = {:type => type, :maxgray => maxgray}
143
148
  options[:comment] = content[:comments].join("\n") if content[:comments]
144
149
 
145
- Image.new(type, pixels, options)
150
+ Image.new(pixels, options)
146
151
  end
147
152
 
148
153
  def self.magic_number # :nodoc:
@@ -12,7 +12,8 @@ module PNM
12
12
  # The height of the image in pixels.
13
13
  attr_reader :height
14
14
 
15
- # The maximum gray or color value. See ::new for details.
15
+ # The maximum gray or color value (for PBM always set to 1).
16
+ # See ::new for details.
16
17
  attr_reader :maxgray
17
18
 
18
19
  # The pixel data, given as a two-dimensional array.
@@ -25,7 +26,6 @@ module PNM
25
26
  # Creates an image from a two-dimensional array of bilevel,
26
27
  # gray, or RGB values.
27
28
  #
28
- # +type+:: The type of the image (+:pbm+, +:pgm+, or +:ppm+).
29
29
  # +pixels+:: The pixel data, given as a two-dimensional array of
30
30
  #
31
31
  # * for PBM: bilevel values (0 or 1),
@@ -33,26 +33,37 @@ module PNM
33
33
  # * for PPM: an array of 3 values between 0 and +maxgray+,
34
34
  # corresponding to red, green, and blue (RGB).
35
35
  #
36
- # PPM also accepts an array of gray values.
36
+ # PPM also accepts an array of bilevel or gray values.
37
37
  #
38
38
  # A value of 0 means that the color is turned off.
39
39
  #
40
40
  # Optional settings that can be specified in the +options+ hash:
41
41
  #
42
+ # +type+:: The type of the image (+:pbm+, +:pgm+, or +:ppm+).
43
+ # By default, the type is guessed from the provided
44
+ # pixel data, unless this option is used.
42
45
  # +maxgray+:: The maximum gray or color value.
43
46
  # For PGM and PPM, +maxgray+ must be less or equal 255
44
- # (the default value). For PBM, this setting is ignored
45
- # and +maxgray+ is always set to 1.
47
+ # (the default value).
48
+ # For PBM pixel data, setting +maxgray+ implies a conversion
49
+ # to +:pgm+. If +type+ is explicitly set to +:pbm+,
50
+ # the +maxgray+ setting is disregarded.
46
51
  # +comment+:: A multiline comment string (default: empty string).
47
- def initialize(type, pixels, options = {})
48
- @type = type
52
+ def initialize(pixels, options = {})
53
+ @type = options[:type]
49
54
  @width = pixels.first.size
50
55
  @height = pixels.size
51
- @maxgray = options[:maxgray] || 255
56
+ @maxgray = options[:maxgray]
52
57
  @comment = (options[:comment] || '').chomp
53
58
  @pixels = pixels
54
59
 
55
- @maxgray = 1 if type == :pbm
60
+ @type ||= detect_type(@pixels, @maxgray)
61
+
62
+ if @type == :pbm
63
+ @maxgray = 1
64
+ else
65
+ @maxgray ||= 255
66
+ end
56
67
 
57
68
  if type == :ppm && !pixels.first.first.kind_of?(Array)
58
69
  @pixels = pixels.map {|row| row.map {|pixel| gray_to_rgb(pixel) } }
@@ -99,6 +110,16 @@ module PNM
99
110
  end
100
111
  end
101
112
 
113
+ def detect_type(pixels, maxgray) # :nodoc:
114
+ if pixels.first.first.kind_of?(Array)
115
+ :ppm
116
+ elsif pixels.flatten.max <= 1
117
+ maxgray ? :pgm : :pbm
118
+ else
119
+ :pgm
120
+ end
121
+ end
122
+
102
123
  def header(encoding) # :nodoc:
103
124
  header = "#{PNM.magic_number[type][encoding]}\n"
104
125
  if comment
@@ -1,4 +1,4 @@
1
1
  module PNM
2
- VERSION = '0.1.0' # :nodoc:
3
- DATE = '2013-10-26' # :nodoc:
2
+ VERSION = '0.2.0' # :nodoc:
3
+ DATE = '2013-12-01' # :nodoc:
4
4
  end
@@ -20,7 +20,7 @@ describe PNM::Image do
20
20
  [0,0,1,0,0],
21
21
  [0,0,0,0,0]]
22
22
  comment = 'Bilevel'
23
- @bilevel = PNM::Image.new(:pbm, pixels, {:comment => comment})
23
+ @bilevel = PNM::Image.new(pixels, {:comment => comment})
24
24
 
25
25
  pixels = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
26
26
  [0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0],
@@ -28,25 +28,77 @@ describe PNM::Image do
28
28
  [0,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0],
29
29
  [0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,0],
30
30
  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
31
- @bilevel_2 = PNM::Image.new(:pbm, pixels)
31
+ @bilevel_2 = PNM::Image.new(pixels)
32
32
 
33
33
  pixels = [[ 0, 50,100,150],
34
34
  [ 50,100,150,200],
35
35
  [100,150,200,250]]
36
36
  comment = "Grayscale\n(with multiline comment)"
37
- @grayscale = PNM::Image.new(:pgm, pixels, {:maxgray => 250, :comment => comment})
37
+ @grayscale = PNM::Image.new(pixels, {:maxgray => 250, :comment => comment})
38
38
 
39
39
  pixels = [[65,66], [13,10], [65,66]]
40
- @grayscale_crlf = PNM::Image.new(:pgm, pixels)
40
+ @grayscale_crlf = PNM::Image.new(pixels)
41
41
 
42
42
  pixels = [[[0,6,0], [1,5,1], [2,4,2], [3,3,4], [4,2,6]],
43
43
  [[1,5,2], [2,4,2], [3,3,2], [4,2,2], [5,1,2]],
44
44
  [[2,4,6], [3,3,4], [4,2,2], [5,1,1], [6,0,0]]]
45
- @color = PNM::Image.new(:ppm, pixels, {:maxgray => 6})
45
+ @color = PNM::Image.new(pixels, {:maxgray => 6})
46
+ end
47
+
48
+ it 'sets maxgray to 1 for bilevel images' do
49
+ image = PNM::Image.new([[0,1,0], [1,0,1]])
50
+ image.type.must_equal :pbm
51
+ image.maxgray.must_equal 1
52
+ end
53
+
54
+ it 'sets maxgray by default to 255 for grayscale images' do
55
+ image = PNM::Image.new([[0,10,20], [10,20,30]])
56
+ image.type.must_equal :pgm
57
+ image.maxgray.must_equal 255
58
+ end
59
+
60
+ it 'sets maxgray by default to 255 for color images' do
61
+ image = PNM::Image.new([[[0,0,0], [10,10,10]], [[10,10,10], [20,20,20]]])
62
+ image.type.must_equal :ppm
63
+ image.maxgray.must_equal 255
64
+ end
65
+
66
+ it 'ignores maxgray for bilevel images and sets it to 1' do
67
+ image = PNM::Image.new([[0,1,0], [1,0,1]], {:type => :pbm, :maxgray => 255})
68
+ image.type.must_equal :pbm
69
+ image.maxgray.must_equal 1
70
+ end
71
+
72
+ it 'can create a grayscale image from bilevel values (using type)' do
73
+ image = PNM::Image.new([[0,1,0], [1,0,1]], {:type => :pgm})
74
+ image.type.must_equal :pgm
75
+ image.pixels.must_equal [[0,1,0], [1,0,1]]
76
+ image.maxgray.must_equal 255
77
+ end
78
+
79
+ it 'can create a grayscale image from bilevel values (using maxgray)' do
80
+ image = PNM::Image.new([[0,1,0], [1,0,1]], {:maxgray => 1})
81
+ image.type.must_equal :pgm
82
+ image.pixels.must_equal [[0,1,0], [1,0,1]]
83
+ image.maxgray.must_equal 1
84
+ end
85
+
86
+ it 'can create a color image from bilevel values' do
87
+ image = PNM::Image.new([[0,1,0], [1,0,1]], {:type => :ppm})
88
+ image.info.must_match %r{^PPM 3x2 Color}
89
+ image.pixels.must_equal [[[0,0,0], [1,1,1], [0,0,0]], [[1,1,1], [0,0,0], [1,1,1]]]
90
+ image.maxgray.must_equal 255
91
+ end
92
+
93
+ it 'can create a color image from bilevel values with a given maxgray' do
94
+ image = PNM::Image.new([[0,1,0], [1,0,1]], {:type => :ppm, :maxgray => 2})
95
+ image.info.must_match %r{^PPM 3x2 Color}
96
+ image.pixels.must_equal [[[0,0,0], [1,1,1], [0,0,0]], [[1,1,1], [0,0,0], [1,1,1]]]
97
+ image.maxgray.must_equal 2
46
98
  end
47
99
 
48
100
  it 'can create a color image from gray values' do
49
- image = PNM::Image.new(:ppm, [[0,3,6], [3,6,9]])
101
+ image = PNM::Image.new([[0,3,6], [3,6,9]], {:type => :ppm})
50
102
  image.info.must_match %r{^PPM 3x2 Color}
51
103
  image.pixels.must_equal [[[0,0,0], [3,3,3], [6,6,6]], [[3,3,3], [6,6,6], [9,9,9]]]
52
104
  end
@@ -105,7 +157,7 @@ describe PNM::Image do
105
157
  File.delete(@temp_path)
106
158
  end
107
159
 
108
- it 'can write binary data containing CRLF from an I/O stream' do
160
+ it 'can write binary data containing CRLF to an I/O stream' do
109
161
  File.open(@temp_path, 'w') {|f| @grayscale_crlf.write(f, :binary) }
110
162
  File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
111
163
  File.delete(@temp_path)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pnm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcus Stollsteimer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-26 00:00:00.000000000 Z
11
+ date: 2013-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -77,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  version: '0'
78
78
  requirements: []
79
79
  rubyforge_project:
80
- rubygems_version: 2.1.9
80
+ rubygems_version: 2.1.11
81
81
  signing_key:
82
82
  specification_version: 4
83
83
  summary: PNM - create/read/write PNM image files (PBM, PGM, PPM)