...

Source file src/image/jpeg/writer.go

     1	// Copyright 2011 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     4	
     5	package jpeg
     6	
     7	import (
     8		"bufio"
     9		"errors"
    10		"image"
    11		"image/color"
    12		"io"
    13	)
    14	
    15	// min returns the minimum of two integers.
    16	func min(x, y int) int {
    17		if x < y {
    18			return x
    19		}
    20		return y
    21	}
    22	
    23	// div returns a/b rounded to the nearest integer, instead of rounded to zero.
    24	func div(a, b int32) int32 {
    25		if a >= 0 {
    26			return (a + (b >> 1)) / b
    27		}
    28		return -((-a + (b >> 1)) / b)
    29	}
    30	
    31	// bitCount counts the number of bits needed to hold an integer.
    32	var bitCount = [256]byte{
    33		0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
    34		5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    35		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    36		6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    37		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    38		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    39		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    40		7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    41		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    42		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    43		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    44		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    45		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    46		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    47		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    48		8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
    49	}
    50	
    51	type quantIndex int
    52	
    53	const (
    54		quantIndexLuminance quantIndex = iota
    55		quantIndexChrominance
    56		nQuantIndex
    57	)
    58	
    59	// unscaledQuant are the unscaled quantization tables in zig-zag order. Each
    60	// encoder copies and scales the tables according to its quality parameter.
    61	// The values are derived from section K.1 after converting from natural to
    62	// zig-zag order.
    63	var unscaledQuant = [nQuantIndex][blockSize]byte{
    64		// Luminance.
    65		{
    66			16, 11, 12, 14, 12, 10, 16, 14,
    67			13, 14, 18, 17, 16, 19, 24, 40,
    68			26, 24, 22, 22, 24, 49, 35, 37,
    69			29, 40, 58, 51, 61, 60, 57, 51,
    70			56, 55, 64, 72, 92, 78, 64, 68,
    71			87, 69, 55, 56, 80, 109, 81, 87,
    72			95, 98, 103, 104, 103, 62, 77, 113,
    73			121, 112, 100, 120, 92, 101, 103, 99,
    74		},
    75		// Chrominance.
    76		{
    77			17, 18, 18, 24, 21, 24, 47, 26,
    78			26, 47, 99, 66, 56, 66, 99, 99,
    79			99, 99, 99, 99, 99, 99, 99, 99,
    80			99, 99, 99, 99, 99, 99, 99, 99,
    81			99, 99, 99, 99, 99, 99, 99, 99,
    82			99, 99, 99, 99, 99, 99, 99, 99,
    83			99, 99, 99, 99, 99, 99, 99, 99,
    84			99, 99, 99, 99, 99, 99, 99, 99,
    85		},
    86	}
    87	
    88	type huffIndex int
    89	
    90	const (
    91		huffIndexLuminanceDC huffIndex = iota
    92		huffIndexLuminanceAC
    93		huffIndexChrominanceDC
    94		huffIndexChrominanceAC
    95		nHuffIndex
    96	)
    97	
    98	// huffmanSpec specifies a Huffman encoding.
    99	type huffmanSpec struct {
   100		// count[i] is the number of codes of length i bits.
   101		count [16]byte
   102		// value[i] is the decoded value of the i'th codeword.
   103		value []byte
   104	}
   105	
   106	// theHuffmanSpec is the Huffman encoding specifications.
   107	// This encoder uses the same Huffman encoding for all images.
   108	var theHuffmanSpec = [nHuffIndex]huffmanSpec{
   109		// Luminance DC.
   110		{
   111			[16]byte{0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
   112			[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
   113		},
   114		// Luminance AC.
   115		{
   116			[16]byte{0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125},
   117			[]byte{
   118				0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
   119				0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
   120				0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
   121				0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
   122				0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
   123				0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
   124				0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
   125				0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
   126				0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
   127				0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
   128				0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
   129				0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
   130				0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
   131				0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
   132				0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
   133				0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
   134				0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
   135				0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
   136				0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
   137				0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
   138				0xf9, 0xfa,
   139			},
   140		},
   141		// Chrominance DC.
   142		{
   143			[16]byte{0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
   144			[]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
   145		},
   146		// Chrominance AC.
   147		{
   148			[16]byte{0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119},
   149			[]byte{
   150				0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
   151				0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
   152				0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
   153				0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
   154				0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
   155				0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
   156				0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
   157				0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
   158				0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
   159				0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
   160				0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
   161				0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
   162				0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
   163				0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
   164				0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
   165				0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
   166				0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
   167				0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
   168				0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
   169				0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
   170				0xf9, 0xfa,
   171			},
   172		},
   173	}
   174	
   175	// huffmanLUT is a compiled look-up table representation of a huffmanSpec.
   176	// Each value maps to a uint32 of which the 8 most significant bits hold the
   177	// codeword size in bits and the 24 least significant bits hold the codeword.
   178	// The maximum codeword size is 16 bits.
   179	type huffmanLUT []uint32
   180	
   181	func (h *huffmanLUT) init(s huffmanSpec) {
   182		maxValue := 0
   183		for _, v := range s.value {
   184			if int(v) > maxValue {
   185				maxValue = int(v)
   186			}
   187		}
   188		*h = make([]uint32, maxValue+1)
   189		code, k := uint32(0), 0
   190		for i := 0; i < len(s.count); i++ {
   191			nBits := uint32(i+1) << 24
   192			for j := uint8(0); j < s.count[i]; j++ {
   193				(*h)[s.value[k]] = nBits | code
   194				code++
   195				k++
   196			}
   197			code <<= 1
   198		}
   199	}
   200	
   201	// theHuffmanLUT are compiled representations of theHuffmanSpec.
   202	var theHuffmanLUT [4]huffmanLUT
   203	
   204	func init() {
   205		for i, s := range theHuffmanSpec {
   206			theHuffmanLUT[i].init(s)
   207		}
   208	}
   209	
   210	// writer is a buffered writer.
   211	type writer interface {
   212		Flush() error
   213		io.Writer
   214		io.ByteWriter
   215	}
   216	
   217	// encoder encodes an image to the JPEG format.
   218	type encoder struct {
   219		// w is the writer to write to. err is the first error encountered during
   220		// writing. All attempted writes after the first error become no-ops.
   221		w   writer
   222		err error
   223		// buf is a scratch buffer.
   224		buf [16]byte
   225		// bits and nBits are accumulated bits to write to w.
   226		bits, nBits uint32
   227		// quant is the scaled quantization tables, in zig-zag order.
   228		quant [nQuantIndex][blockSize]byte
   229	}
   230	
   231	func (e *encoder) flush() {
   232		if e.err != nil {
   233			return
   234		}
   235		e.err = e.w.Flush()
   236	}
   237	
   238	func (e *encoder) write(p []byte) {
   239		if e.err != nil {
   240			return
   241		}
   242		_, e.err = e.w.Write(p)
   243	}
   244	
   245	func (e *encoder) writeByte(b byte) {
   246		if e.err != nil {
   247			return
   248		}
   249		e.err = e.w.WriteByte(b)
   250	}
   251	
   252	// emit emits the least significant nBits bits of bits to the bit-stream.
   253	// The precondition is bits < 1<<nBits && nBits <= 16.
   254	func (e *encoder) emit(bits, nBits uint32) {
   255		nBits += e.nBits
   256		bits <<= 32 - nBits
   257		bits |= e.bits
   258		for nBits >= 8 {
   259			b := uint8(bits >> 24)
   260			e.writeByte(b)
   261			if b == 0xff {
   262				e.writeByte(0x00)
   263			}
   264			bits <<= 8
   265			nBits -= 8
   266		}
   267		e.bits, e.nBits = bits, nBits
   268	}
   269	
   270	// emitHuff emits the given value with the given Huffman encoder.
   271	func (e *encoder) emitHuff(h huffIndex, value int32) {
   272		x := theHuffmanLUT[h][value]
   273		e.emit(x&(1<<24-1), x>>24)
   274	}
   275	
   276	// emitHuffRLE emits a run of runLength copies of value encoded with the given
   277	// Huffman encoder.
   278	func (e *encoder) emitHuffRLE(h huffIndex, runLength, value int32) {
   279		a, b := value, value
   280		if a < 0 {
   281			a, b = -value, value-1
   282		}
   283		var nBits uint32
   284		if a < 0x100 {
   285			nBits = uint32(bitCount[a])
   286		} else {
   287			nBits = 8 + uint32(bitCount[a>>8])
   288		}
   289		e.emitHuff(h, runLength<<4|int32(nBits))
   290		if nBits > 0 {
   291			e.emit(uint32(b)&(1<<nBits-1), nBits)
   292		}
   293	}
   294	
   295	// writeMarkerHeader writes the header for a marker with the given length.
   296	func (e *encoder) writeMarkerHeader(marker uint8, markerlen int) {
   297		e.buf[0] = 0xff
   298		e.buf[1] = marker
   299		e.buf[2] = uint8(markerlen >> 8)
   300		e.buf[3] = uint8(markerlen & 0xff)
   301		e.write(e.buf[:4])
   302	}
   303	
   304	// writeDQT writes the Define Quantization Table marker.
   305	func (e *encoder) writeDQT() {
   306		const markerlen = 2 + int(nQuantIndex)*(1+blockSize)
   307		e.writeMarkerHeader(dqtMarker, markerlen)
   308		for i := range e.quant {
   309			e.writeByte(uint8(i))
   310			e.write(e.quant[i][:])
   311		}
   312	}
   313	
   314	// writeSOF0 writes the Start Of Frame (Baseline Sequential) marker.
   315	func (e *encoder) writeSOF0(size image.Point, nComponent int) {
   316		markerlen := 8 + 3*nComponent
   317		e.writeMarkerHeader(sof0Marker, markerlen)
   318		e.buf[0] = 8 // 8-bit color.
   319		e.buf[1] = uint8(size.Y >> 8)
   320		e.buf[2] = uint8(size.Y & 0xff)
   321		e.buf[3] = uint8(size.X >> 8)
   322		e.buf[4] = uint8(size.X & 0xff)
   323		e.buf[5] = uint8(nComponent)
   324		if nComponent == 1 {
   325			e.buf[6] = 1
   326			// No subsampling for grayscale image.
   327			e.buf[7] = 0x11
   328			e.buf[8] = 0x00
   329		} else {
   330			for i := 0; i < nComponent; i++ {
   331				e.buf[3*i+6] = uint8(i + 1)
   332				// We use 4:2:0 chroma subsampling.
   333				e.buf[3*i+7] = "\x22\x11\x11"[i]
   334				e.buf[3*i+8] = "\x00\x01\x01"[i]
   335			}
   336		}
   337		e.write(e.buf[:3*(nComponent-1)+9])
   338	}
   339	
   340	// writeDHT writes the Define Huffman Table marker.
   341	func (e *encoder) writeDHT(nComponent int) {
   342		markerlen := 2
   343		specs := theHuffmanSpec[:]
   344		if nComponent == 1 {
   345			// Drop the Chrominance tables.
   346			specs = specs[:2]
   347		}
   348		for _, s := range specs {
   349			markerlen += 1 + 16 + len(s.value)
   350		}
   351		e.writeMarkerHeader(dhtMarker, markerlen)
   352		for i, s := range specs {
   353			e.writeByte("\x00\x10\x01\x11"[i])
   354			e.write(s.count[:])
   355			e.write(s.value)
   356		}
   357	}
   358	
   359	// writeBlock writes a block of pixel data using the given quantization table,
   360	// returning the post-quantized DC value of the DCT-transformed block. b is in
   361	// natural (not zig-zag) order.
   362	func (e *encoder) writeBlock(b *block, q quantIndex, prevDC int32) int32 {
   363		fdct(b)
   364		// Emit the DC delta.
   365		dc := div(b[0], 8*int32(e.quant[q][0]))
   366		e.emitHuffRLE(huffIndex(2*q+0), 0, dc-prevDC)
   367		// Emit the AC components.
   368		h, runLength := huffIndex(2*q+1), int32(0)
   369		for zig := 1; zig < blockSize; zig++ {
   370			ac := div(b[unzig[zig]], 8*int32(e.quant[q][zig]))
   371			if ac == 0 {
   372				runLength++
   373			} else {
   374				for runLength > 15 {
   375					e.emitHuff(h, 0xf0)
   376					runLength -= 16
   377				}
   378				e.emitHuffRLE(h, runLength, ac)
   379				runLength = 0
   380			}
   381		}
   382		if runLength > 0 {
   383			e.emitHuff(h, 0x00)
   384		}
   385		return dc
   386	}
   387	
   388	// toYCbCr converts the 8x8 region of m whose top-left corner is p to its
   389	// YCbCr values.
   390	func toYCbCr(m image.Image, p image.Point, yBlock, cbBlock, crBlock *block) {
   391		b := m.Bounds()
   392		xmax := b.Max.X - 1
   393		ymax := b.Max.Y - 1
   394		for j := 0; j < 8; j++ {
   395			for i := 0; i < 8; i++ {
   396				r, g, b, _ := m.At(min(p.X+i, xmax), min(p.Y+j, ymax)).RGBA()
   397				yy, cb, cr := color.RGBToYCbCr(uint8(r>>8), uint8(g>>8), uint8(b>>8))
   398				yBlock[8*j+i] = int32(yy)
   399				cbBlock[8*j+i] = int32(cb)
   400				crBlock[8*j+i] = int32(cr)
   401			}
   402		}
   403	}
   404	
   405	// grayToY stores the 8x8 region of m whose top-left corner is p in yBlock.
   406	func grayToY(m *image.Gray, p image.Point, yBlock *block) {
   407		b := m.Bounds()
   408		xmax := b.Max.X - 1
   409		ymax := b.Max.Y - 1
   410		pix := m.Pix
   411		for j := 0; j < 8; j++ {
   412			for i := 0; i < 8; i++ {
   413				idx := m.PixOffset(min(p.X+i, xmax), min(p.Y+j, ymax))
   414				yBlock[8*j+i] = int32(pix[idx])
   415			}
   416		}
   417	}
   418	
   419	// rgbaToYCbCr is a specialized version of toYCbCr for image.RGBA images.
   420	func rgbaToYCbCr(m *image.RGBA, p image.Point, yBlock, cbBlock, crBlock *block) {
   421		b := m.Bounds()
   422		xmax := b.Max.X - 1
   423		ymax := b.Max.Y - 1
   424		for j := 0; j < 8; j++ {
   425			sj := p.Y + j
   426			if sj > ymax {
   427				sj = ymax
   428			}
   429			offset := (sj-b.Min.Y)*m.Stride - b.Min.X*4
   430			for i := 0; i < 8; i++ {
   431				sx := p.X + i
   432				if sx > xmax {
   433					sx = xmax
   434				}
   435				pix := m.Pix[offset+sx*4:]
   436				yy, cb, cr := color.RGBToYCbCr(pix[0], pix[1], pix[2])
   437				yBlock[8*j+i] = int32(yy)
   438				cbBlock[8*j+i] = int32(cb)
   439				crBlock[8*j+i] = int32(cr)
   440			}
   441		}
   442	}
   443	
   444	// yCbCrToYCbCr is a specialized version of toYCbCr for image.YCbCr images.
   445	func yCbCrToYCbCr(m *image.YCbCr, p image.Point, yBlock, cbBlock, crBlock *block) {
   446		b := m.Bounds()
   447		xmax := b.Max.X - 1
   448		ymax := b.Max.Y - 1
   449		for j := 0; j < 8; j++ {
   450			sy := p.Y + j
   451			if sy > ymax {
   452				sy = ymax
   453			}
   454			for i := 0; i < 8; i++ {
   455				sx := p.X + i
   456				if sx > xmax {
   457					sx = xmax
   458				}
   459				yi := m.YOffset(sx, sy)
   460				ci := m.COffset(sx, sy)
   461				yBlock[8*j+i] = int32(m.Y[yi])
   462				cbBlock[8*j+i] = int32(m.Cb[ci])
   463				crBlock[8*j+i] = int32(m.Cr[ci])
   464			}
   465		}
   466	}
   467	
   468	// scale scales the 16x16 region represented by the 4 src blocks to the 8x8
   469	// dst block.
   470	func scale(dst *block, src *[4]block) {
   471		for i := 0; i < 4; i++ {
   472			dstOff := (i&2)<<4 | (i&1)<<2
   473			for y := 0; y < 4; y++ {
   474				for x := 0; x < 4; x++ {
   475					j := 16*y + 2*x
   476					sum := src[i][j] + src[i][j+1] + src[i][j+8] + src[i][j+9]
   477					dst[8*y+x+dstOff] = (sum + 2) >> 2
   478				}
   479			}
   480		}
   481	}
   482	
   483	// sosHeaderY is the SOS marker "\xff\xda" followed by 8 bytes:
   484	//	- the marker length "\x00\x08",
   485	//	- the number of components "\x01",
   486	//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
   487	//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
   488	//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
   489	//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
   490	var sosHeaderY = []byte{
   491		0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00,
   492	}
   493	
   494	// sosHeaderYCbCr is the SOS marker "\xff\xda" followed by 12 bytes:
   495	//	- the marker length "\x00\x0c",
   496	//	- the number of components "\x03",
   497	//	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
   498	//	- component 2 uses DC table 1 and AC table 1 "\x02\x11",
   499	//	- component 3 uses DC table 1 and AC table 1 "\x03\x11",
   500	//	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
   501	//	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
   502	//	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
   503	var sosHeaderYCbCr = []byte{
   504		0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02,
   505		0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
   506	}
   507	
   508	// writeSOS writes the StartOfScan marker.
   509	func (e *encoder) writeSOS(m image.Image) {
   510		switch m.(type) {
   511		case *image.Gray:
   512			e.write(sosHeaderY)
   513		default:
   514			e.write(sosHeaderYCbCr)
   515		}
   516		var (
   517			// Scratch buffers to hold the YCbCr values.
   518			// The blocks are in natural (not zig-zag) order.
   519			b      block
   520			cb, cr [4]block
   521			// DC components are delta-encoded.
   522			prevDCY, prevDCCb, prevDCCr int32
   523		)
   524		bounds := m.Bounds()
   525		switch m := m.(type) {
   526		// TODO(wathiede): switch on m.ColorModel() instead of type.
   527		case *image.Gray:
   528			for y := bounds.Min.Y; y < bounds.Max.Y; y += 8 {
   529				for x := bounds.Min.X; x < bounds.Max.X; x += 8 {
   530					p := image.Pt(x, y)
   531					grayToY(m, p, &b)
   532					prevDCY = e.writeBlock(&b, 0, prevDCY)
   533				}
   534			}
   535		default:
   536			rgba, _ := m.(*image.RGBA)
   537			ycbcr, _ := m.(*image.YCbCr)
   538			for y := bounds.Min.Y; y < bounds.Max.Y; y += 16 {
   539				for x := bounds.Min.X; x < bounds.Max.X; x += 16 {
   540					for i := 0; i < 4; i++ {
   541						xOff := (i & 1) * 8
   542						yOff := (i & 2) * 4
   543						p := image.Pt(x+xOff, y+yOff)
   544						if rgba != nil {
   545							rgbaToYCbCr(rgba, p, &b, &cb[i], &cr[i])
   546						} else if ycbcr != nil {
   547							yCbCrToYCbCr(ycbcr, p, &b, &cb[i], &cr[i])
   548						} else {
   549							toYCbCr(m, p, &b, &cb[i], &cr[i])
   550						}
   551						prevDCY = e.writeBlock(&b, 0, prevDCY)
   552					}
   553					scale(&b, &cb)
   554					prevDCCb = e.writeBlock(&b, 1, prevDCCb)
   555					scale(&b, &cr)
   556					prevDCCr = e.writeBlock(&b, 1, prevDCCr)
   557				}
   558			}
   559		}
   560		// Pad the last byte with 1's.
   561		e.emit(0x7f, 7)
   562	}
   563	
   564	// DefaultQuality is the default quality encoding parameter.
   565	const DefaultQuality = 75
   566	
   567	// Options are the encoding parameters.
   568	// Quality ranges from 1 to 100 inclusive, higher is better.
   569	type Options struct {
   570		Quality int
   571	}
   572	
   573	// Encode writes the Image m to w in JPEG 4:2:0 baseline format with the given
   574	// options. Default parameters are used if a nil *Options is passed.
   575	func Encode(w io.Writer, m image.Image, o *Options) error {
   576		b := m.Bounds()
   577		if b.Dx() >= 1<<16 || b.Dy() >= 1<<16 {
   578			return errors.New("jpeg: image is too large to encode")
   579		}
   580		var e encoder
   581		if ww, ok := w.(writer); ok {
   582			e.w = ww
   583		} else {
   584			e.w = bufio.NewWriter(w)
   585		}
   586		// Clip quality to [1, 100].
   587		quality := DefaultQuality
   588		if o != nil {
   589			quality = o.Quality
   590			if quality < 1 {
   591				quality = 1
   592			} else if quality > 100 {
   593				quality = 100
   594			}
   595		}
   596		// Convert from a quality rating to a scaling factor.
   597		var scale int
   598		if quality < 50 {
   599			scale = 5000 / quality
   600		} else {
   601			scale = 200 - quality*2
   602		}
   603		// Initialize the quantization tables.
   604		for i := range e.quant {
   605			for j := range e.quant[i] {
   606				x := int(unscaledQuant[i][j])
   607				x = (x*scale + 50) / 100
   608				if x < 1 {
   609					x = 1
   610				} else if x > 255 {
   611					x = 255
   612				}
   613				e.quant[i][j] = uint8(x)
   614			}
   615		}
   616		// Compute number of components based on input image type.
   617		nComponent := 3
   618		switch m.(type) {
   619		// TODO(wathiede): switch on m.ColorModel() instead of type.
   620		case *image.Gray:
   621			nComponent = 1
   622		}
   623		// Write the Start Of Image marker.
   624		e.buf[0] = 0xff
   625		e.buf[1] = 0xd8
   626		e.write(e.buf[:2])
   627		// Write the quantization tables.
   628		e.writeDQT()
   629		// Write the image dimensions.
   630		e.writeSOF0(b.Size(), nComponent)
   631		// Write the Huffman tables.
   632		e.writeDHT(nComponent)
   633		// Write the image data.
   634		e.writeSOS(m)
   635		// Write the End Of Image marker.
   636		e.buf[0] = 0xff
   637		e.buf[1] = 0xd9
   638		e.write(e.buf[:2])
   639		e.flush()
   640		return e.err
   641	}
   642	

View as plain text