From cc009687bc30793097166b4aaf21ed34d7192809 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Thu, 5 Mar 2015 17:54:46 +1100 Subject: [PATCH] image/jpeg: support RGB JPEG images. The testdata was generated by: convert video-001.png tmp1.tga cjpeg -rgb -sample 2x2,1x1,1x1 tmp1.tga > video-001.rgb.jpeg djpeg -nosmooth -targa video-001.rgb.jpeg > tmp2.tga convert tmp2.tga video-001.rgb.png rm tmp1.tga tmp2.tga Change-Id: I5da0591b9005c1c75e807311f157d385e0e20a38 Reviewed-on: https://go-review.googlesource.com/6910 Reviewed-by: Rob Pike --- src/image/decode_test.go | 1 + src/image/jpeg/reader.go | 83 ++++++++++++++++++++++++-- src/image/testdata/video-001.rgb.jpeg | Bin 0 -> 6237 bytes src/image/testdata/video-001.rgb.png | Bin 0 -> 20414 bytes 4 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 src/image/testdata/video-001.rgb.jpeg create mode 100644 src/image/testdata/video-001.rgb.png diff --git a/src/image/decode_test.go b/src/image/decode_test.go index e88bfdaaae..8b0b6e84b0 100644 --- a/src/image/decode_test.go +++ b/src/image/decode_test.go @@ -33,6 +33,7 @@ var imageTests = []imageTest{ {"testdata/video-001.png", "testdata/video-001.jpeg", 8 << 8}, {"testdata/video-001.png", "testdata/video-001.progressive.jpeg", 8 << 8}, {"testdata/video-001.cmyk.png", "testdata/video-001.cmyk.jpeg", 8 << 8}, + {"testdata/video-001.rgb.png", "testdata/video-001.rgb.jpeg", 8 << 8}, // Grayscale images. {"testdata/video-005.gray.png", "testdata/video-005.gray.jpeg", 8 << 8}, {"testdata/video-005.gray.png", "testdata/video-005.gray.png", 0}, diff --git a/src/image/jpeg/reader.go b/src/image/jpeg/reader.go index 994c42232e..7293f45617 100644 --- a/src/image/jpeg/reader.go +++ b/src/image/jpeg/reader.go @@ -126,6 +126,7 @@ type decoder struct { ri int // Restart Interval. nComp int progressive bool + jfif bool adobeTransformValid bool adobeTransform uint8 eobRun uint16 // End-of-Band run, specified in section G.1.2.2. @@ -297,7 +298,7 @@ func (d *decoder) processSOF(n int) error { switch n { case 6 + 3*1: // Grayscale image. d.nComp = 1 - case 6 + 3*3: // YCbCr image. (TODO(nigeltao): or RGB image.) + case 6 + 3*3: // YCbCr or RGB image. d.nComp = 3 case 6 + 3*4: // YCbCrK or CMYK image. d.nComp = 4 @@ -448,6 +449,23 @@ func (d *decoder) processDRI(n int) error { return nil } +func (d *decoder) processApp0Marker(n int) error { + if n < 5 { + return d.ignore(n) + } + if err := d.readFull(d.tmp[:5]); err != nil { + return err + } + n -= 5 + + d.jfif = d.tmp[0] == 'J' && d.tmp[1] == 'F' && d.tmp[2] == 'I' && d.tmp[3] == 'F' && d.tmp[4] == '\x00' + + if n > 0 { + return d.ignore(n) + } + return nil +} + func (d *decoder) processApp14Marker(n int) error { if n < 12 { return d.ignore(n) @@ -553,17 +571,34 @@ func (d *decoder) decode(r io.Reader, configOnly bool) (image.Image, error) { case sof0Marker, sof1Marker, sof2Marker: d.progressive = marker == sof2Marker err = d.processSOF(n) - if configOnly { + if configOnly && d.jfif { return nil, err } case dhtMarker: - err = d.processDHT(n) + if configOnly { + err = d.ignore(n) + } else { + err = d.processDHT(n) + } case dqtMarker: - err = d.processDQT(n) + if configOnly { + err = d.ignore(n) + } else { + err = d.processDQT(n) + } case sosMarker: + if configOnly { + return nil, nil + } err = d.processSOS(n) case driMarker: - err = d.processDRI(n) + if configOnly { + err = d.ignore(n) + } else { + err = d.processDRI(n) + } + case app0Marker: + err = d.processApp0Marker(n) case app14Marker: err = d.processApp14Marker(n) default: @@ -585,6 +620,8 @@ func (d *decoder) decode(r io.Reader, configOnly bool) (image.Image, error) { if d.img3 != nil { if d.blackPix != nil { return d.applyBlack() + } else if d.isRGB() { + return d.convertToRGB() } return d.img3, nil } @@ -663,6 +700,36 @@ func (d *decoder) applyBlack() (image.Image, error) { return img, nil } +func (d *decoder) isRGB() bool { + if d.jfif { + return false + } + if d.adobeTransformValid && d.adobeTransform == adobeTransformUnknown { + // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/JPEG.html#Adobe + // says that 0 means Unknown (and in practice RGB) and 1 means YCbCr. + return true + } + return d.comp[0].c == 'R' && d.comp[1].c == 'G' && d.comp[2].c == 'B' +} + +func (d *decoder) convertToRGB() (image.Image, error) { + cScale := d.comp[0].h / d.comp[1].h + bounds := d.img3.Bounds() + img := image.NewRGBA(bounds) + for y := bounds.Min.Y; y < bounds.Max.Y; y++ { + po := img.PixOffset(bounds.Min.X, y) + yo := d.img3.YOffset(bounds.Min.X, y) + co := d.img3.COffset(bounds.Min.X, y) + for i, iMax := 0, bounds.Max.X-bounds.Min.X; i < iMax; i++ { + img.Pix[po+4*i+0] = d.img3.Y[yo+i] + img.Pix[po+4*i+1] = d.img3.Cb[co+i/cScale] + img.Pix[po+4*i+2] = d.img3.Cr[co+i/cScale] + img.Pix[po+4*i+3] = 255 + } + } + return img, nil +} + // drawYCbCr is the non-exported drawYCbCr function copy/pasted from the // image/draw package. It is copy/pasted because it doesn't seem right for the // image/jpeg package to depend on image/draw. @@ -760,8 +827,12 @@ func DecodeConfig(r io.Reader) (image.Config, error) { Height: d.height, }, nil case 3: + cm := color.YCbCrModel + if d.isRGB() { + cm = color.RGBAModel + } return image.Config{ - ColorModel: color.YCbCrModel, // TODO(nigeltao): support RGB JPEGs. + ColorModel: cm, Width: d.width, Height: d.height, }, nil diff --git a/src/image/testdata/video-001.rgb.jpeg b/src/image/testdata/video-001.rgb.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..fc2ce3ca91fb030186d3f9a497fc3fbf33c502b7 GIT binary patch literal 6237 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 literal 0 HcmV?d00001 diff --git a/src/image/testdata/video-001.rgb.png b/src/image/testdata/video-001.rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..edb716d3415dd62c07307d56da5f120d484bb2e5 GIT binary patch literal 20414 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

-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

@^y+iphvP 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 literal 0 HcmV?d00001 -- 2.48.1