From e39b2394e57209d375d2483054624219fee70a17 Mon Sep 17 00:00:00 2001 From: ChaiShushan Date: Fri, 13 Sep 2013 17:42:53 +1000 Subject: [PATCH] go.image/tiff: encoder support Gray/Gray16/Paletted format Use these commands to generate testdata: # TIFF Tools tiff2bw video-001.tiff video-001-gray.tiff tiffmedian video-001.tiff video-001-paletted.tiff # ImageMagick convert -depth 16 video-001.tiff video-001-16bit.tiff convert -depth 16 video-001-gray.tiff video-001-gray-16bit.tiff R=nigeltao, bsiegert CC=golang-dev https://golang.org/cl/13243047 --- testdata/video-001-16bit.tiff | Bin 0 -> 42146 bytes testdata/video-001-gray-16bit.tiff | Bin 0 -> 31254 bytes testdata/video-001-gray.tiff | Bin 0 -> 15742 bytes testdata/video-001-paletted.tiff | Bin 0 -> 11214 bytes tiff/writer.go | 189 +++++++++++++++++++++++------ tiff/writer_test.go | 15 ++- 6 files changed, 160 insertions(+), 44 deletions(-) create mode 100644 testdata/video-001-16bit.tiff create mode 100644 testdata/video-001-gray-16bit.tiff create mode 100644 testdata/video-001-gray.tiff create mode 100644 testdata/video-001-paletted.tiff diff --git a/testdata/video-001-16bit.tiff b/testdata/video-001-16bit.tiff new file mode 100644 index 0000000000000000000000000000000000000000..3b05ef018704af0ea59392d6c6bbb41cde27874d GIT binary patch literal 42146 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 literal 0 HcmV?d00001 diff --git a/testdata/video-001-gray-16bit.tiff b/testdata/video-001-gray-16bit.tiff new file mode 100644 index 0000000000000000000000000000000000000000..356882a56a5fa9dff0be539c73c56a5498fe6c54 GIT binary patch literal 31254 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 G=l=opV1GRT literal 0 HcmV?d00001 diff --git a/testdata/video-001-gray.tiff b/testdata/video-001-gray.tiff new file mode 100644 index 0000000000000000000000000000000000000000..38fc9d2d1190410fdf343475456f1d440cf54e14 GIT binary patch literal 15742 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 UY#cg1#_^By!N7nU_5Wk}e{;~ZP5=M^ literal 0 HcmV?d00001 diff --git a/tiff/writer.go b/tiff/writer.go index 274b115..2cdd74e 100644 --- a/tiff/writer.go +++ b/tiff/writer.go @@ -55,13 +55,85 @@ func (d byTag) Len() int { return len(d) } func (d byTag) Less(i, j int) bool { return d[i].tag < d[j].tag } func (d byTag) Swap(i, j int) { d[i], d[j] = d[j], d[i] } -// writeImgData writes the raw data of m into w, optionally using a -// differencing predictor. -func writeImgData(w io.Writer, m image.Image, predictor bool) error { +func encodeGray(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { + if !predictor { + return writePix(w, pix, dy, dx, stride) + } + buf := make([]byte, dx) + for y := 0; y < dy; y++ { + min := y*stride + 0 + max := y*stride + dx + off := 0 + var v0 uint8 + for i := min; i < max; i++ { + v1 := pix[i] + buf[off] = v1 - v0 + v0 = v1 + off++ + } + if _, err := w.Write(buf); err != nil { + return err + } + } + return nil +} + +func encodeGray16(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { + buf := make([]byte, dx*2) + for y := 0; y < dy; y++ { + min := y*stride + 0 + max := y*stride + dx*2 + off := 0 + var v0 uint16 + for i := min; i < max; i += 2 { + // An image.Gray16's Pix is in big-endian order. + v1 := uint16(pix[i])<<8 | uint16(pix[i+1]) + if predictor { + v0, v1 = v1, v1-v0 + } + // We only write little-endian TIFF files. + buf[off+0] = byte(v1) + buf[off+1] = byte(v1 >> 8) + off += 2 + } + if _, err := w.Write(buf); err != nil { + return err + } + } + return nil +} + +func encodeRGBA(w io.Writer, pix []uint8, dx, dy, stride int, predictor bool) error { + if !predictor { + return writePix(w, pix, dy, dx*4, stride) + } + buf := make([]byte, dx*4) + for y := 0; y < dy; y++ { + min := y*stride + 0 + max := y*stride + dx*4 + off := 0 + var r0, g0, b0, a0 uint8 + for i := min; i < max; i += 4 { + r1, g1, b1, a1 := pix[i+0], pix[i+1], pix[i+2], pix[i+3] + buf[off+0] = r1 - r0 + buf[off+1] = g1 - g0 + buf[off+2] = b1 - b0 + buf[off+3] = a1 - a0 + off += 4 + r0, g0, b0, a0 = r1, g1, b1, a1 + } + if _, err := w.Write(buf); err != nil { + return err + } + } + return nil +} + +func encode(w io.Writer, m image.Image, predictor bool) error { bounds := m.Bounds() buf := make([]byte, 4*bounds.Dx()) for y := bounds.Min.Y; y < bounds.Max.Y; y++ { - i := 0 + off := 0 if predictor { var r0, g0, b0, a0 uint8 for x := bounds.Min.X; x < bounds.Max.X; x++ { @@ -70,21 +142,21 @@ func writeImgData(w io.Writer, m image.Image, predictor bool) error { g1 := uint8(g >> 8) b1 := uint8(b >> 8) a1 := uint8(a >> 8) - buf[i+0] = r1 - r0 - buf[i+1] = g1 - g0 - buf[i+2] = b1 - b0 - buf[i+3] = a1 - a0 - i += 4 + buf[off+0] = r1 - r0 + buf[off+1] = g1 - g0 + buf[off+2] = b1 - b0 + buf[off+3] = a1 - a0 + off += 4 r0, g0, b0, a0 = r1, g1, b1, a1 } } else { for x := bounds.Min.X; x < bounds.Max.X; x++ { r, g, b, a := m.At(x, y).RGBA() - buf[i+0] = uint8(r >> 8) - buf[i+1] = uint8(g >> 8) - buf[i+2] = uint8(b >> 8) - buf[i+3] = uint8(a >> 8) - i += 4 + buf[off+0] = uint8(r >> 8) + buf[off+1] = uint8(g >> 8) + buf[off+2] = uint8(b >> 8) + buf[off+3] = uint8(a >> 8) + off += 4 } } if _, err := w.Write(buf); err != nil { @@ -95,7 +167,7 @@ func writeImgData(w io.Writer, m image.Image, predictor bool) error { } // writePix writes the internal byte array of an image to w. It is less general -// but much faster then writeImgData. writePix is used when pix directly +// but much faster then encode. writePix is used when pix directly // corresponds to one of the TIFF image types. func writePix(w io.Writer, pix []byte, nrows, length, stride int) error { if length == stride { @@ -180,6 +252,8 @@ type Options struct { // encoding, such as the compression type. If opt is nil, an uncompressed // image is written. func Encode(w io.Writer, m image.Image, opt *Options) error { + d := m.Bounds().Size() + predictor := false compression := uint32(cNone) if opt != nil { @@ -201,14 +275,21 @@ func Encode(w io.Writer, m image.Image, opt *Options) error { // imageLen is the length of the pixel data in bytes. // The offset of the IFD is imageLen + 8 header bytes. var imageLen int - bounds := m.Bounds() - width, height := bounds.Dx(), bounds.Dy() switch compression { case cNone: dst = w // Write IFD offset before outputting pixel data. - imageLen = width * height * 4 + switch m.(type) { + case *image.Paletted: + imageLen = d.X * d.Y * 1 + case *image.Gray: + imageLen = d.X * d.Y * 1 + case *image.Gray16: + imageLen = d.X * d.Y * 2 + default: + imageLen = d.X * d.Y * 4 + } err = binary.Write(w, enc, uint32(imageLen+8)) if err != nil { return err @@ -217,23 +298,46 @@ func Encode(w io.Writer, m image.Image, opt *Options) error { dst = zlib.NewWriter(&buf) } - var pr uint32 = prNone - var extrasamples uint32 = 1 // Associated alpha (default). + pr := uint32(prNone) + photometricInterpretation := uint32(pRGB) + samplesPerPixel := uint32(4) + bitsPerSample := []uint32{8, 8, 8, 8} + extrasamples := uint32(1) // Associated alpha (default). + colorMap := []uint32{} + if predictor { pr = prHorizontal - err = writeImgData(dst, m, predictor) - } else { - switch img := m.(type) { - case *image.NRGBA: - extrasamples = 2 // Unassociated alpha. - off := img.PixOffset(img.Rect.Min.X, img.Rect.Min.Y) - err = writePix(dst, img.Pix[off:], img.Rect.Dy(), 4*img.Rect.Dx(), img.Stride) - case *image.RGBA: - off := img.PixOffset(img.Rect.Min.X, img.Rect.Min.Y) - err = writePix(dst, img.Pix[off:], img.Rect.Dy(), 4*img.Rect.Dx(), img.Stride) - default: - err = writeImgData(dst, m, predictor) + } + switch m := m.(type) { + case *image.Paletted: + photometricInterpretation = pPaletted + samplesPerPixel = 3 + bitsPerSample = []uint32{8} + colorMap = make([]uint32, 256*3) + for i := 0; i < 256 && i < len(m.Palette); i++ { + r, g, b, _ := m.Palette[i].RGBA() + colorMap[i+0*256] = uint32(r) + colorMap[i+1*256] = uint32(g) + colorMap[i+2*256] = uint32(b) } + err = encodeGray(dst, m.Pix, d.X, d.Y, m.Stride, predictor) + case *image.Gray: + photometricInterpretation = pBlackIsZero + samplesPerPixel = 1 + bitsPerSample = []uint32{8} + err = encodeGray(dst, m.Pix, d.X, d.Y, m.Stride, predictor) + case *image.Gray16: + photometricInterpretation = pBlackIsZero + samplesPerPixel = 1 + bitsPerSample = []uint32{16} + err = encodeGray16(dst, m.Pix, d.X, d.Y, m.Stride, predictor) + case *image.NRGBA: + extrasamples = 2 // Unassociated alpha. + err = encodeRGBA(dst, m.Pix, d.X, d.Y, m.Stride, predictor) + case *image.RGBA: + err = encodeRGBA(dst, m.Pix, d.X, d.Y, m.Stride, predictor) + default: + err = encode(dst, m, predictor) } if err != nil { return err @@ -252,15 +356,15 @@ func Encode(w io.Writer, m image.Image, opt *Options) error { } } - return writeIFD(w, imageLen+8, []ifdEntry{ - {tImageWidth, dtShort, []uint32{uint32(width)}}, - {tImageLength, dtShort, []uint32{uint32(height)}}, - {tBitsPerSample, dtShort, []uint32{8, 8, 8, 8}}, + ifd := []ifdEntry{ + {tImageWidth, dtShort, []uint32{uint32(d.X)}}, + {tImageLength, dtShort, []uint32{uint32(d.Y)}}, + {tBitsPerSample, dtShort, bitsPerSample}, {tCompression, dtShort, []uint32{compression}}, - {tPhotometricInterpretation, dtShort, []uint32{pRGB}}, + {tPhotometricInterpretation, dtShort, []uint32{photometricInterpretation}}, {tStripOffsets, dtLong, []uint32{8}}, - {tSamplesPerPixel, dtShort, []uint32{4}}, - {tRowsPerStrip, dtShort, []uint32{uint32(height)}}, + {tSamplesPerPixel, dtShort, []uint32{samplesPerPixel}}, + {tRowsPerStrip, dtShort, []uint32{uint32(d.Y)}}, {tStripByteCounts, dtLong, []uint32{uint32(imageLen)}}, // There is currently no support for storing the image // resolution, so give a bogus value of 72x72 dpi. @@ -269,5 +373,10 @@ func Encode(w io.Writer, m image.Image, opt *Options) error { {tResolutionUnit, dtShort, []uint32{resPerInch}}, {tPredictor, dtShort, []uint32{pr}}, {tExtraSamples, dtShort, []uint32{extrasamples}}, - }) + } + if len(colorMap) != 0 { + ifd = append(ifd, ifdEntry{tColorMap, dtShort, colorMap}) + } + + return writeIFD(w, imageLen+8, ifd) } diff --git a/tiff/writer_test.go b/tiff/writer_test.go index 500a446..644ac49 100644 --- a/tiff/writer_test.go +++ b/tiff/writer_test.go @@ -17,6 +17,9 @@ var roundtripTests = []struct { opts *Options }{ {"video-001.tiff", nil}, + {"video-001-gray.tiff", nil}, + {"video-001-gray-16bit.tiff", nil}, + {"video-001-paletted.tiff", nil}, {"bw-packbits.tiff", nil}, {"video-001.tiff", &Options{Predictor: true}}, {"video-001.tiff", &Options{Compression: Deflate}}, @@ -70,16 +73,20 @@ func TestRoundtrip2(t *testing.T) { compare(t, m0, m1) } -// BenchmarkEncode benchmarks the encoding of an image. -func BenchmarkEncode(b *testing.B) { - img, err := openImage("video-001.tiff") +func benchmarkEncode(b *testing.B, name string, pixelSize int) { + img, err := openImage(name) if err != nil { b.Fatal(err) } s := img.Bounds().Size() - b.SetBytes(int64(s.X * s.Y * 4)) + b.SetBytes(int64(s.X * s.Y * pixelSize)) b.ResetTimer() for i := 0; i < b.N; i++ { Encode(ioutil.Discard, img, nil) } } + +func BenchmarkEncode(b *testing.B) { benchmarkEncode(b, "video-001.tiff", 4) } +func BenchmarkEncodePaletted(b *testing.B) { benchmarkEncode(b, "video-001-paletted.tiff", 1) } +func BenchmarkEncodeGray(b *testing.B) { benchmarkEncode(b, "video-001-gray.tiff", 1) } +func BenchmarkEncodeGray16(b *testing.B) { benchmarkEncode(b, "video-001-gray-16bit.tiff", 2) }