go.image/tiff: Support missing Compression tag
no_compress.tiff is no_rps.tiff that was read in by go.image/tiff and written out again (with a hack to avoid creating the Compression tag on the way out).
$ tiffdump no_compress.tiff
no_compress.tiff:
Magic: 0x4949 <little-endian> Version: 0x2a
Directory 0: offset 968 (0x3c8) next 0 (0)
ImageWidth (256) SHORT (3) 1<16>
ImageLength (257) SHORT (3) 1<15>
BitsPerSample (258) SHORT (3) 4<8 8 8 8>
Photometric (262) SHORT (3) 1<2>
StripOffsets (273) LONG (4) 1<8>
SamplesPerPixel (277) SHORT (3) 1<4>
RowsPerStrip (278) SHORT (3) 1<15>
StripByteCounts (279) LONG (4) 1<960>
XResolution (282) RATIONAL (5) 1<72>
YResolution (283) RATIONAL (5) 1<72>
ResolutionUnit (296) SHORT (3) 1<2>
ExtraSamples (338) SHORT (3) 1<2>
LGTM=bsiegert, nigeltao
R=bsiegert, nigeltao
CC=golang-codereviews
https://golang.org/cl/95930044
diff --git a/testdata/no_compress.tiff b/testdata/no_compress.tiff
new file mode 100644
index 0000000..3f72b29
--- /dev/null
+++ b/testdata/no_compress.tiff
Binary files differ
diff --git a/tiff/reader.go b/tiff/reader.go
index fcb2b56..ea4f1f2 100644
--- a/tiff/reader.go
+++ b/tiff/reader.go
@@ -11,6 +11,7 @@
"compress/lzw"
"compress/zlib"
"encoding/binary"
+ "fmt"
"image"
"image/color"
"io"
@@ -553,7 +554,11 @@
offset := int64(blockOffsets[j*blocksAcross+i])
n := int64(blockCounts[j*blocksAcross+i])
switch d.firstVal(tCompression) {
- case cNone:
+
+ // According to the spec, Compression does not have a default value,
+ // but some tools interpret a missing Compression value as none so we do
+ // the same.
+ case cNone, 0:
if b, ok := d.r.(*buffer); ok {
d.buf, err = b.Slice(int(offset), int(n))
} else {
@@ -574,7 +579,7 @@
case cPackBits:
d.buf, err = unpackBits(io.NewSectionReader(d.r, offset, n))
default:
- err = UnsupportedError("compression")
+ err = UnsupportedError(fmt.Sprintf("compression value %d", d.firstVal(tCompression)))
}
if err != nil {
return nil, err
diff --git a/tiff/reader_test.go b/tiff/reader_test.go
index 8539e9c..d62e277 100644
--- a/tiff/reader_test.go
+++ b/tiff/reader_test.go
@@ -44,6 +44,15 @@
}
}
+// TestNoCompression tries to decode an images that has no Compression tag.
+// This tag is mandatory, but most tools interpret a missing value as no compression.
+func TestNoCompression(t *testing.T) {
+ _, err := load("no_compress.tiff")
+ if err != nil {
+ t.Fatal(err)
+ }
+}
+
// TestUnpackBits tests the decoding of PackBits-encoded data.
func TestUnpackBits(t *testing.T) {
var unpackBitsTests = []struct {