chunky_png 1.3.7 → 1.3.8
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/CHANGELOG.rdoc +4 -0
- data/lib/chunky_png.rb +5 -0
- data/lib/chunky_png/chunk.rb +42 -0
- data/lib/chunky_png/datastream.rb +6 -0
- data/lib/chunky_png/version.rb +1 -1
- data/spec/chunky_png/datastream_spec.rb +18 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de005461c2c1664cf8c8328e5769415e26b365fe
|
4
|
+
data.tar.gz: 0cf85db842b733efc160097379b39af523930694
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68ceb6232a10ad75694c1f908b2c7a16d9bb5b0f9c5cf0f2c017b02b60e5655e99341ab44d6135975888b8855ced580054365d670494f64ea35eeee2eabc1ed6
|
7
|
+
data.tar.gz: 791b4ce5e7e2228b5d3ba0c41edb1f9d0b649bbe15f6ea808bca5c716fad10205f1cff408a3f79daf8389664e58124f4e53e74018ece8da38afed0cf685e3ce7
|
data/CHANGELOG.rdoc
CHANGED
@@ -9,6 +9,10 @@ The file documents the changes to this library over the different versions.
|
|
9
9
|
|
10
10
|
- Nothing yet!
|
11
11
|
|
12
|
+
=== 1.3.8 - 2016-08-31
|
13
|
+
|
14
|
+
- Add support for reading and writing an image's physical dimension (pHYs chunks).
|
15
|
+
|
12
16
|
=== 1.3.7 - 2016-08-31
|
13
17
|
|
14
18
|
- Performance improvement for <tt>Color.euclidean_distance_rgba</tt>.
|
data/lib/chunky_png.rb
CHANGED
@@ -121,6 +121,11 @@ module ChunkyPNG
|
|
121
121
|
class OutOfBounds < ChunkyPNG::ExpectationFailed
|
122
122
|
end
|
123
123
|
|
124
|
+
# Exception that is raised when requesting the DPI of a PNG that doesn't
|
125
|
+
# specify the units of its physical pixel dimensions.
|
126
|
+
class UnitsUnknown < ChunkyPNG::Exception
|
127
|
+
end
|
128
|
+
|
124
129
|
def self.force_binary(str)
|
125
130
|
str.respond_to?(:force_encoding) ? str.force_encoding('BINARY') : str
|
126
131
|
end
|
data/lib/chunky_png/chunk.rb
CHANGED
@@ -319,6 +319,47 @@ module ChunkyPNG
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
|
322
|
+
# The Physical (pHYs) chunk specifies the intended pixel size or aspect
|
323
|
+
# ratio for display of the image.
|
324
|
+
#
|
325
|
+
# http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.pHYs
|
326
|
+
#
|
327
|
+
class Physical < Generic
|
328
|
+
attr_accessor :ppux, :ppuy, :unit
|
329
|
+
|
330
|
+
def initialize(ppux, ppuy, unit = :unknown)
|
331
|
+
raise ArgumentError, 'unit must be either :meters or :unknown' unless [:meters, :unknown].member?(unit)
|
332
|
+
super('pHYs')
|
333
|
+
@ppux, @ppuy, @unit = ppux, ppuy, unit
|
334
|
+
end
|
335
|
+
|
336
|
+
def dpix
|
337
|
+
raise ChunkyPNG::UnitsUnknown, 'the PNG specifies its physical aspect ratio, but does not specify the units of its pixels\' physical dimensions' unless unit == :meters
|
338
|
+
ppux * INCHES_PER_METER
|
339
|
+
end
|
340
|
+
|
341
|
+
def dpiy
|
342
|
+
raise ChunkyPNG::UnitsUnknown, 'the PNG specifies its physical aspect ratio, but does not specify the units of its pixels\' physical dimensions' unless unit == :meters
|
343
|
+
ppuy * INCHES_PER_METER
|
344
|
+
end
|
345
|
+
|
346
|
+
def self.read(type, content)
|
347
|
+
ppux, ppuy, unit = content.unpack('NNC')
|
348
|
+
unit = unit == 1 ? :meters : :unknown
|
349
|
+
new(ppux, ppuy, unit)
|
350
|
+
end
|
351
|
+
|
352
|
+
# Creates the content to write to the stream, by concatenating the
|
353
|
+
# keyword with the deflated value, joined by a null character.
|
354
|
+
#
|
355
|
+
# @return The content that should be written to the datastream.
|
356
|
+
def content
|
357
|
+
[ppux, ppuy, unit == :meters ? 1 : 0].pack('NNC')
|
358
|
+
end
|
359
|
+
|
360
|
+
INCHES_PER_METER = 0.0254
|
361
|
+
end
|
362
|
+
|
322
363
|
# The Text (iTXt) chunk contains keyword/value metadata about the PNG
|
323
364
|
# stream.
|
324
365
|
#
|
@@ -352,6 +393,7 @@ module ChunkyPNG
|
|
352
393
|
'tEXt' => Text,
|
353
394
|
'zTXt' => CompressedText,
|
354
395
|
'iTXt' => InternationalText,
|
396
|
+
'pHYs' => Physical,
|
355
397
|
}
|
356
398
|
end
|
357
399
|
end
|
@@ -29,6 +29,10 @@ module ChunkyPNG
|
|
29
29
|
# @return [ChunkyPNG::Chunk::Transparency]
|
30
30
|
attr_accessor :transparency_chunk
|
31
31
|
|
32
|
+
# The chunk containing the physical dimensions of the PNG's pixels.
|
33
|
+
# @return [ChunkyPNG::Chunk::Physical]
|
34
|
+
attr_accessor :physical_chunk
|
35
|
+
|
32
36
|
# The chunks that together compose the images pixel data.
|
33
37
|
# @return [Array<ChunkyPNG::Chunk::ImageData>]
|
34
38
|
attr_accessor :data_chunks
|
@@ -81,6 +85,7 @@ module ChunkyPNG
|
|
81
85
|
when ChunkyPNG::Chunk::Palette; ds.palette_chunk = chunk
|
82
86
|
when ChunkyPNG::Chunk::Transparency; ds.transparency_chunk = chunk
|
83
87
|
when ChunkyPNG::Chunk::ImageData; ds.data_chunks << chunk
|
88
|
+
when ChunkyPNG::Chunk::Physical; ds.physical_chunk = chunk
|
84
89
|
when ChunkyPNG::Chunk::End; ds.end_chunk = chunk
|
85
90
|
else ds.other_chunks << chunk
|
86
91
|
end
|
@@ -121,6 +126,7 @@ module ChunkyPNG
|
|
121
126
|
other_chunks.each { |chunk| yield(chunk) }
|
122
127
|
yield(palette_chunk) if palette_chunk
|
123
128
|
yield(transparency_chunk) if transparency_chunk
|
129
|
+
yield(physical_chunk) if physical_chunk
|
124
130
|
data_chunks.each { |chunk| yield(chunk) }
|
125
131
|
yield(end_chunk)
|
126
132
|
end
|
data/lib/chunky_png/version.rb
CHANGED
@@ -40,4 +40,22 @@ describe ChunkyPNG::Datastream do
|
|
40
40
|
expect(ds.metadata['Copyright']).to eql "Copyright Willem van Schaik, Singapore 1995-96"
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
describe '#physical_chunk' do
|
45
|
+
it 'should read and write pHYs chunks correctly' do
|
46
|
+
filename = resource_file('clock.png')
|
47
|
+
ds = ChunkyPNG::Datastream.from_file(filename)
|
48
|
+
expect(ds.physical_chunk.unit).to eql :meters
|
49
|
+
expect(ds.physical_chunk.dpix.round).to eql 72
|
50
|
+
expect(ds.physical_chunk.dpiy.round).to eql 72
|
51
|
+
ds = ChunkyPNG::Datastream.from_blob(ds.to_blob)
|
52
|
+
expect(ds.physical_chunk).not_to be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should raise ChunkyPNG::UnitsUnknown if we request dpi but the units are unknown' do
|
56
|
+
physical_chunk = ChunkyPNG::Chunk::Physical.new(2835, 2835, :unknown)
|
57
|
+
expect{physical_chunk.dpix}.to raise_error(ChunkyPNG::UnitsUnknown)
|
58
|
+
expect{physical_chunk.dpiy}.to raise_error(ChunkyPNG::UnitsUnknown)
|
59
|
+
end
|
60
|
+
end
|
43
61
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chunky_png
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Willem van Bergen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|