format_parser 0.8.0 → 0.9.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
  SHA256:
3
- metadata.gz: 789592107e9fa74091745b703249248b6a05e9dd73af45803ab799708f8498fc
4
- data.tar.gz: 191ff20e5b8d455f681eb19b40a2bd406c1cfa1a9b2aeebaa483ea829071e532
3
+ metadata.gz: 91bcb409bce9e0576a83680ef91cd6e910e6df9b4bc4953cb23de8d887021b59
4
+ data.tar.gz: ef6f74cd026bb3dd26e16c3282f9ec71e5b63f8e957d4b818cdac0acbc058c74
5
5
  SHA512:
6
- metadata.gz: dde5379a4d0590019ac6eee21361e10688f8582efa169132f28a0dc531f6b05811368e987a3a30902dcc1a509952c11bb9810bee3f3dbd17e99f3c13f1776b71
7
- data.tar.gz: ec5a699fb441ca622006fb2885a6e1ce623da0a7ea6a5b78e5df83db2a1f9227dd023681f12a7ec703188133a8276e363dd3e5c090bca3ce694064124925e47e
6
+ metadata.gz: c118d28ecce997d45058d3b19de89d1c8ab6a88df390c58875f4ad22b36043f4562913c78c66cea380357184d48fddf6cf5736a8f7f7eb62a83fea6bddc85b13
7
+ data.tar.gz: 70ee5504c514fbed060ca62cf0cd0e429f1f01535e805de6a974dbcd5a9154b81c859a70a09ad39fc2ef8c341391f3f1f2a2ed3566a19976884dea03b9d541d6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.9.0
2
+ * Add a parser for the BMP image file format
3
+
1
4
  ## 0.8.0
2
5
  * Add `Measurometer` for applying instrumentation around FormatParser operaions. See documentation for usage.
3
6
 
@@ -1,3 +1,3 @@
1
1
  module FormatParser
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.0'
3
3
  end
@@ -0,0 +1,41 @@
1
+ # Based on https://en.wikipedia.org/wiki/BMP_file_format
2
+
3
+ class FormatParser::BMPParser
4
+ include FormatParser::IOUtils
5
+
6
+ VALID_BMP = 'BM'
7
+ PIXEL_ARRAY_OFFSET = 54
8
+
9
+ def call(io)
10
+ io = FormatParser::IOConstraint.new(io)
11
+
12
+ magic_number, _file_size, _reserved1, _reserved2, dib_header_location = safe_read(io, 14).unpack('A2Vv2V')
13
+ return unless VALID_BMP == magic_number
14
+ return unless dib_header_location == PIXEL_ARRAY_OFFSET
15
+
16
+ dib_header = safe_read(io, 40)
17
+
18
+ _header_size, width, height, _planes, _bits_per_pixel,
19
+ _compression_method, _image_size, horizontal_res,
20
+ vertical_res, _n_colors, _i_colors = dib_header.unpack('Vl<2v2V2l<2V2')
21
+
22
+ # There are cases where the height might by negative indicating the data
23
+ # is ordered from top to bottom instead of bottom to top
24
+ # http://www.dragonwins.com/domains/getteched/bmp/bmpfileformat.htm#The%20Image%20Header
25
+ data_order = height < 0 ? :inverse : :normal
26
+
27
+ FormatParser::Image.new(
28
+ format: :bmp,
29
+ width_px: width,
30
+ height_px: height.abs,
31
+ color_mode: :rgb,
32
+ intrinsics: {
33
+ vertical_resolution: vertical_res,
34
+ horizontal_resolution: horizontal_res,
35
+ data_order: data_order
36
+ }
37
+ )
38
+ end
39
+
40
+ FormatParser.register_parser self, natures: :image, formats: :bmp
41
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe FormatParser::BMPParser do
4
+ it 'parses a BMP file with positive height_px values' do
5
+ bmp_path = fixtures_dir + '/BMP/test.bmp'
6
+ parsed = subject.call(File.open(bmp_path, 'rb'))
7
+
8
+ expect(parsed).not_to be_nil
9
+ expect(parsed.nature).to eq(:image)
10
+ expect(parsed.format).to eq(:bmp)
11
+ expect(parsed.color_mode).to eq(:rgb)
12
+
13
+ expect(parsed.width_px).to eq(40)
14
+ expect(parsed.height_px).to eq(27)
15
+
16
+ expect(parsed.intrinsics).not_to be_nil
17
+ expect(parsed.intrinsics[:vertical_resolution]).to eq(2834)
18
+ expect(parsed.intrinsics[:horizontal_resolution]).to eq(2834)
19
+ expect(parsed.intrinsics[:data_order]).to eq(:normal)
20
+ end
21
+
22
+ it 'parses a BMP file with negative height_px values (divergent scan order)' do
23
+ bmp_path = fixtures_dir + '/BMP/test2.bmp'
24
+ parsed = subject.call(File.open(bmp_path, 'rb'))
25
+
26
+ expect(parsed).not_to be_nil
27
+ expect(parsed.nature).to eq(:image)
28
+ expect(parsed.format).to eq(:bmp)
29
+ expect(parsed.color_mode).to eq(:rgb)
30
+
31
+ expect(parsed.width_px).to eq(1920)
32
+ expect(parsed.height_px).to eq(1080)
33
+
34
+ expect(parsed.intrinsics).not_to be_nil
35
+ expect(parsed.intrinsics[:vertical_resolution]).to eq(2835)
36
+ expect(parsed.intrinsics[:horizontal_resolution]).to eq(2835)
37
+ expect(parsed.intrinsics[:data_order]).to eq(:inverse)
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: format_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noah Berman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-04-17 00:00:00.000000000 Z
12
+ date: 2018-04-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ks
@@ -172,6 +172,7 @@ files:
172
172
  - lib/io_utils.rb
173
173
  - lib/measurometer.rb
174
174
  - lib/parsers/aiff_parser.rb
175
+ - lib/parsers/bmp_parser.rb
175
176
  - lib/parsers/cr2_parser.rb
176
177
  - lib/parsers/dpx_parser.rb
177
178
  - lib/parsers/exif_parser.rb
@@ -204,6 +205,7 @@ files:
204
205
  - spec/io_utils_spec.rb
205
206
  - spec/measurometer_spec.rb
206
207
  - spec/parsers/aiff_parser_spec.rb
208
+ - spec/parsers/bmp_parser_spec.rb
207
209
  - spec/parsers/cr2_parser_spec.rb
208
210
  - spec/parsers/dpx_parser_spec.rb
209
211
  - spec/parsers/exif_parser_spec.rb