pnm 0.1.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.
@@ -0,0 +1,113 @@
1
+ # test_image.rb: Unit tests for the PNM library.
2
+ #
3
+ # Copyright (C) 2013 Marcus Stollsteimer
4
+
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'pnm/image'
8
+
9
+
10
+ describe PNM::Image do
11
+
12
+ before do
13
+ @srcpath = File.dirname(__FILE__)
14
+ @temp_path = File.expand_path("#{@srcpath}/temp.pnm")
15
+
16
+ pixels = [[0,0,0,0,0],
17
+ [0,1,1,1,0],
18
+ [0,0,1,0,0],
19
+ [0,0,1,0,0],
20
+ [0,0,1,0,0],
21
+ [0,0,0,0,0]]
22
+ comment = 'Bilevel'
23
+ @bilevel = PNM::Image.new(:pbm, pixels, {:comment => comment})
24
+
25
+ pixels = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
26
+ [0,1,1,1,0,1,1,1,1,0,1,1,1,1,1,0],
27
+ [0,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0],
28
+ [0,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0],
29
+ [0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,0],
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)
32
+
33
+ pixels = [[ 0, 50,100,150],
34
+ [ 50,100,150,200],
35
+ [100,150,200,250]]
36
+ comment = "Grayscale\n(with multiline comment)"
37
+ @grayscale = PNM::Image.new(:pgm, pixels, {:maxgray => 250, :comment => comment})
38
+
39
+ pixels = [[65,66], [13,10], [65,66]]
40
+ @grayscale_crlf = PNM::Image.new(:pgm, pixels)
41
+
42
+ pixels = [[[0,6,0], [1,5,1], [2,4,2], [3,3,4], [4,2,6]],
43
+ [[1,5,2], [2,4,2], [3,3,2], [4,2,2], [5,1,2]],
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})
46
+ end
47
+
48
+ it 'can create a color image from gray values' do
49
+ image = PNM::Image.new(:ppm, [[0,3,6], [3,6,9]])
50
+ image.info.must_match %r{^PPM 3x2 Color}
51
+ image.pixels.must_equal [[[0,0,0], [3,3,3], [6,6,6]], [[3,3,3], [6,6,6], [9,9,9]]]
52
+ end
53
+
54
+ it 'can write a bilevel image to an ASCII encoded file' do
55
+ @bilevel.write(@temp_path, :ascii)
56
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_ascii.pbm")
57
+ File.delete(@temp_path)
58
+ end
59
+
60
+ it 'can write a bilevel image (width 5) to a binary encoded file' do
61
+ @bilevel.write(@temp_path, :binary)
62
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_binary.pbm")
63
+ File.delete(@temp_path)
64
+ end
65
+
66
+ it 'can write a bilevel image (width 16) to a binary encoded file' do
67
+ @bilevel_2.write(@temp_path, :binary)
68
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/bilevel_2_binary.pbm")
69
+ File.delete(@temp_path)
70
+ end
71
+
72
+ it 'can write a grayscale image to an ASCII encoded file' do
73
+ @grayscale.write(@temp_path, :ascii)
74
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_ascii.pgm")
75
+ File.delete(@temp_path)
76
+ end
77
+
78
+ it 'can write a grayscale image to a binary encoded file' do
79
+ @grayscale.write(@temp_path, :binary)
80
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary.pgm")
81
+ File.delete(@temp_path)
82
+ end
83
+
84
+ it 'can write a color image to an ASCII encoded file' do
85
+ @color.write(@temp_path, :ascii)
86
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/color_ascii.ppm")
87
+ File.delete(@temp_path)
88
+ end
89
+
90
+ it 'can write a color image to a binary encoded file' do
91
+ @color.write(@temp_path, :binary)
92
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/color_binary.ppm")
93
+ File.delete(@temp_path)
94
+ end
95
+
96
+ it 'can return image information' do
97
+ @bilevel.info.must_equal 'PBM 5x6 Bilevel'
98
+ @grayscale.info.must_equal 'PGM 4x3 Grayscale'
99
+ @color.info.must_equal 'PPM 5x3 Color'
100
+ end
101
+
102
+ it 'can write binary data containing CRLF' do
103
+ @grayscale_crlf.write(@temp_path, :binary)
104
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
105
+ File.delete(@temp_path)
106
+ end
107
+
108
+ it 'can write binary data containing CRLF from an I/O stream' do
109
+ File.open(@temp_path, 'w') {|f| @grayscale_crlf.write(f, :binary) }
110
+ File.binread(@temp_path).must_equal File.binread("#{@srcpath}/grayscale_binary_crlf.pgm")
111
+ File.delete(@temp_path)
112
+ end
113
+ end
@@ -0,0 +1,119 @@
1
+ # test_parser.rb: Unit tests for the PNM library.
2
+ #
3
+ # Copyright (C) 2013 Marcus Stollsteimer
4
+
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'pnm/parser'
8
+
9
+
10
+ describe PNM::Parser do
11
+
12
+ before do
13
+ @parser = PNM::Parser
14
+ end
15
+
16
+ it 'can parse ASCII encoded PBM data' do
17
+ content =<<-EOF.chomp.gsub(/^ */, '')
18
+ P1 6 2
19
+ 0 1 0 0 1 1
20
+ 0 0 0 1 1 1
21
+ EOF
22
+ expected = {
23
+ :magic_number => 'P1',
24
+ :width => '6',
25
+ :height => '2',
26
+ :data => "0 1 0 0 1 1\n0 0 0 1 1 1"
27
+ }
28
+
29
+ @parser.parse(content).must_equal expected
30
+ end
31
+
32
+ it 'can parse ASCII encoded PGM data' do
33
+ content =<<-EOF.chomp.gsub(/^ */, '')
34
+ P2 4 2 100
35
+ 10 20 30 40
36
+ 50 60 70 80
37
+ EOF
38
+ expected = {
39
+ :magic_number => 'P2',
40
+ :width => '4',
41
+ :height => '2',
42
+ :maxgray => '100',
43
+ :data => "10 20 30 40\n50 60 70 80"
44
+ }
45
+
46
+ @parser.parse(content).must_equal expected
47
+ end
48
+
49
+ it 'can parse binary encoded data' do
50
+ content = 'P4 8 2 ' << ['05AF'].pack('H*')
51
+ expected = {
52
+ :magic_number => 'P4',
53
+ :width => '8',
54
+ :height => '2',
55
+ :data => ['05AF'].pack('H*')
56
+ }
57
+
58
+ @parser.parse(content).must_equal expected
59
+ end
60
+
61
+ it 'does not change the passed data' do
62
+ content = 'P1 3 2 0 1 0 0 1 1'
63
+ original_content = content.dup
64
+ @parser.parse(content)
65
+
66
+ content.must_equal original_content
67
+ end
68
+
69
+ it 'does accept multiple whitespace as delimiter' do
70
+ content = "P1 \n\t 3 \r \n2 0 1 0 0 1 1"
71
+ expected = {
72
+ :magic_number => 'P1',
73
+ :width => '3',
74
+ :height => '2',
75
+ :data => '0 1 0 0 1 1'
76
+ }
77
+
78
+ @parser.parse(content).must_equal expected
79
+ end
80
+
81
+ it 'can parse binary encoded data including whitespace' do
82
+ @parser.parse("P4 16 4 A\nB\rC D\t")[:data].must_equal "A\nB\rC D\t"
83
+ end
84
+
85
+ it 'can parse binary encoded data starting with whitespace' do
86
+ @parser.parse("P4 8 2 \nA")[:data].must_equal "\nA"
87
+ end
88
+
89
+ it 'can parse binary encoded data starting with comment character' do
90
+ @parser.parse("P4 8 2 #A")[:data].must_equal "#A"
91
+ end
92
+
93
+ it 'does not chomp newlines from parsed binary encoded data' do
94
+ @parser.parse("P4 8 2 AB\n")[:data].must_equal "AB\n"
95
+ end
96
+
97
+ it 'can parse comments' do
98
+ content =<<-EOF.chomp.gsub(/^ */, '')
99
+ # Comment 1
100
+ P1 # Comment 2
101
+ 6
102
+ #Comment 3
103
+ #
104
+ \r \t# Comment 5
105
+ 2
106
+ 0 1 0 0 1 1
107
+ 0 0 0 1 1 1
108
+ EOF
109
+ expected = {
110
+ :magic_number => 'P1',
111
+ :width => '6',
112
+ :height => '2',
113
+ :comments => ['Comment 1', 'Comment 2', 'Comment 3', '', 'Comment 5'],
114
+ :data => "0 1 0 0 1 1\n0 0 0 1 1 1"
115
+ }
116
+
117
+ @parser.parse(content).must_equal expected
118
+ end
119
+ end
@@ -0,0 +1,105 @@
1
+ # test_pnm.rb: Unit tests for the PNM library.
2
+ #
3
+ # Copyright (C) 2013 Marcus Stollsteimer
4
+
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'pnm'
8
+
9
+
10
+ describe PNM do
11
+
12
+ before do
13
+ @srcpath = File.dirname(__FILE__)
14
+ end
15
+
16
+ it 'can read an ASCII encoded PBM file' do
17
+ file = File.expand_path("#{@srcpath}/bilevel_ascii.pbm")
18
+ image = PNM.read(file)
19
+
20
+ image.info.must_match %r{^PBM 5x6 Bilevel}
21
+ image.maxgray.must_equal 1
22
+ image.comment.must_equal 'Bilevel'
23
+ image.pixels.must_equal [[0,0,0,0,0],
24
+ [0,1,1,1,0],
25
+ [0,0,1,0,0],
26
+ [0,0,1,0,0],
27
+ [0,0,1,0,0],
28
+ [0,0,0,0,0,]]
29
+ end
30
+
31
+ it 'can read an ASCII encoded PGM file' do
32
+ file = File.expand_path("#{@srcpath}/grayscale_ascii.pgm")
33
+ image = PNM.read(file)
34
+
35
+ image.info.must_match %r{^PGM 4x3 Grayscale}
36
+ image.maxgray.must_equal 250
37
+ image.comment.must_equal "Grayscale\n(with multiline comment)"
38
+ image.pixels.must_equal [[ 0, 50,100,150],
39
+ [ 50,100,150,200],
40
+ [100,150,200,250]]
41
+ end
42
+
43
+ it 'can read an ASCII encoded PPM file' do
44
+ file = File.expand_path("#{@srcpath}/color_ascii.ppm")
45
+ image = PNM.read(file)
46
+
47
+ image.info.must_match %r{^PPM 5x3 Color}
48
+ image.maxgray.must_equal 6
49
+ image.pixels.must_equal [[[0,6,0], [1,5,1], [2,4,2], [3,3,4], [4,2,6]],
50
+ [[1,5,2], [2,4,2], [3,3,2], [4,2,2], [5,1,2]],
51
+ [[2,4,6], [3,3,4], [4,2,2], [5,1,1], [6,0,0]]]
52
+ end
53
+
54
+ it 'can read a binary encoded PBM file' do
55
+ file = File.expand_path("#{@srcpath}/bilevel_binary.pbm")
56
+ image = PNM.read(file)
57
+
58
+ image.info.must_match %r{^PBM 5x6 Bilevel}
59
+ image.maxgray.must_equal 1
60
+ image.comment.must_equal 'Bilevel'
61
+ image.pixels.must_equal [[0,0,0,0,0],
62
+ [0,1,1,1,0],
63
+ [0,0,1,0,0],
64
+ [0,0,1,0,0],
65
+ [0,0,1,0,0],
66
+ [0,0,0,0,0,]]
67
+ end
68
+
69
+ it 'can read a binary encoded PGM file' do
70
+ file = File.expand_path("#{@srcpath}/grayscale_binary.pgm")
71
+ image = PNM.read(file)
72
+
73
+ image.info.must_match %r{^PGM 4x3 Grayscale}
74
+ image.maxgray.must_equal 250
75
+ image.comment.must_equal "Grayscale\n(with multiline comment)"
76
+ image.pixels.must_equal [[ 0, 50,100,150],
77
+ [ 50,100,150,200],
78
+ [100,150,200,250]]
79
+ end
80
+
81
+ it 'can read a binary encoded PPM file' do
82
+ file = File.expand_path("#{@srcpath}/color_binary.ppm")
83
+ image = PNM.read(file)
84
+
85
+ image.info.must_match %r{^PPM 5x3 Color}
86
+ image.maxgray.must_equal 6
87
+ image.pixels.must_equal [[[0,6,0], [1,5,1], [2,4,2], [3,3,4], [4,2,6]],
88
+ [[1,5,2], [2,4,2], [3,3,2], [4,2,2], [5,1,2]],
89
+ [[2,4,6], [3,3,4], [4,2,2], [5,1,1], [6,0,0]]]
90
+ end
91
+
92
+ it 'can read binary data containing CRLF' do
93
+ file = File.expand_path("#{@srcpath}/grayscale_binary_crlf.pgm")
94
+
95
+ image = PNM.read(file)
96
+ image.pixels.must_equal [[65,66], [13,10], [65,66]]
97
+ end
98
+
99
+ it 'can read binary data containing CRLF from an I/O stream' do
100
+ file = File.expand_path("#{@srcpath}/grayscale_binary_crlf.pgm")
101
+
102
+ image = File.open(file, 'r') {|f| PNM.read(f) }
103
+ image.pixels.must_equal [[65,66], [13,10], [65,66]]
104
+ end
105
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pnm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Marcus Stollsteimer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: 'PNM is a pure Ruby library for creating, reading, and writing of PNM
28
+ image files (Portable Anymap): PBM (Portable Bitmap), PGM (Portable Graymap), and
29
+ PPM (Portable Pixmap).'
30
+ email: sto.mar@web.de
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - README.md
36
+ - Rakefile
37
+ - pnm.gemspec
38
+ - benchmark/random_image.ppm
39
+ - benchmark/bm_converter.rb
40
+ - benchmark/random_image.pgm
41
+ - benchmark/random_image.pbm
42
+ - lib/pnm.rb
43
+ - lib/pnm/image.rb
44
+ - lib/pnm/parser.rb
45
+ - lib/pnm/version.rb
46
+ - lib/pnm/converter.rb
47
+ - test/bilevel_ascii.pbm
48
+ - test/grayscale_binary.pgm
49
+ - test/test_image.rb
50
+ - test/grayscale_binary_crlf.pgm
51
+ - test/color_binary.ppm
52
+ - test/bilevel_binary.pbm
53
+ - test/test_parser.rb
54
+ - test/test_converter.rb
55
+ - test/bilevel_2_binary.pbm
56
+ - test/color_ascii.ppm
57
+ - test/test_pnm.rb
58
+ - test/grayscale_ascii.pgm
59
+ homepage: https://github.com/stomar/pnm
60
+ licenses:
61
+ - GPL-3
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options:
65
+ - --charset=UTF-8
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 1.9.3
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.1.9
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: PNM - create/read/write PNM image files (PBM, PGM, PPM)
84
+ test_files:
85
+ - test/test_image.rb
86
+ - test/test_parser.rb
87
+ - test/test_converter.rb
88
+ - test/test_pnm.rb