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
This commit is contained in:
parent
f93749e6f2
commit
38c1f4ffe8
BIN
testdata/no_compress.tiff
vendored
Normal file
BIN
testdata/no_compress.tiff
vendored
Normal file
Binary file not shown.
|
@ -11,6 +11,7 @@ import (
|
||||||
"compress/lzw"
|
"compress/lzw"
|
||||||
"compress/zlib"
|
"compress/zlib"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"io"
|
"io"
|
||||||
|
@ -553,7 +554,11 @@ func Decode(r io.Reader) (img image.Image, err error) {
|
||||||
offset := int64(blockOffsets[j*blocksAcross+i])
|
offset := int64(blockOffsets[j*blocksAcross+i])
|
||||||
n := int64(blockCounts[j*blocksAcross+i])
|
n := int64(blockCounts[j*blocksAcross+i])
|
||||||
switch d.firstVal(tCompression) {
|
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 {
|
if b, ok := d.r.(*buffer); ok {
|
||||||
d.buf, err = b.Slice(int(offset), int(n))
|
d.buf, err = b.Slice(int(offset), int(n))
|
||||||
} else {
|
} else {
|
||||||
|
@ -574,7 +579,7 @@ func Decode(r io.Reader) (img image.Image, err error) {
|
||||||
case cPackBits:
|
case cPackBits:
|
||||||
d.buf, err = unpackBits(io.NewSectionReader(d.r, offset, n))
|
d.buf, err = unpackBits(io.NewSectionReader(d.r, offset, n))
|
||||||
default:
|
default:
|
||||||
err = UnsupportedError("compression")
|
err = UnsupportedError(fmt.Sprintf("compression value %d", d.firstVal(tCompression)))
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -44,6 +44,15 @@ func TestNoRPS(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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.
|
// TestUnpackBits tests the decoding of PackBits-encoded data.
|
||||||
func TestUnpackBits(t *testing.T) {
|
func TestUnpackBits(t *testing.T) {
|
||||||
var unpackBitsTests = []struct {
|
var unpackBitsTests = []struct {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user