Home | History | Annotate | Download | only in jpeg
      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) 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 // scale scales the 16x16 region represented by the 4 src blocks to the 8x8
    445 // dst block.
    446 func scale(dst *block, src *[4]block) {
    447 	for i := 0; i < 4; i++ {
    448 		dstOff := (i&2)<<4 | (i&1)<<2
    449 		for y := 0; y < 4; y++ {
    450 			for x := 0; x < 4; x++ {
    451 				j := 16*y + 2*x
    452 				sum := src[i][j] + src[i][j+1] + src[i][j+8] + src[i][j+9]
    453 				dst[8*y+x+dstOff] = (sum + 2) >> 2
    454 			}
    455 		}
    456 	}
    457 }
    458 
    459 // sosHeaderY is the SOS marker "\xff\xda" followed by 8 bytes:
    460 //	- the marker length "\x00\x08",
    461 //	- the number of components "\x01",
    462 //	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
    463 //	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
    464 //	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
    465 //	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
    466 var sosHeaderY = []byte{
    467 	0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00,
    468 }
    469 
    470 // sosHeaderYCbCr is the SOS marker "\xff\xda" followed by 12 bytes:
    471 //	- the marker length "\x00\x0c",
    472 //	- the number of components "\x03",
    473 //	- component 1 uses DC table 0 and AC table 0 "\x01\x00",
    474 //	- component 2 uses DC table 1 and AC table 1 "\x02\x11",
    475 //	- component 3 uses DC table 1 and AC table 1 "\x03\x11",
    476 //	- the bytes "\x00\x3f\x00". Section B.2.3 of the spec says that for
    477 //	  sequential DCTs, those bytes (8-bit Ss, 8-bit Se, 4-bit Ah, 4-bit Al)
    478 //	  should be 0x00, 0x3f, 0x00<<4 | 0x00.
    479 var sosHeaderYCbCr = []byte{
    480 	0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02,
    481 	0x11, 0x03, 0x11, 0x00, 0x3f, 0x00,
    482 }
    483 
    484 // writeSOS writes the StartOfScan marker.
    485 func (e *encoder) writeSOS(m image.Image) {
    486 	switch m.(type) {
    487 	case *image.Gray:
    488 		e.write(sosHeaderY)
    489 	default:
    490 		e.write(sosHeaderYCbCr)
    491 	}
    492 	var (
    493 		// Scratch buffers to hold the YCbCr values.
    494 		// The blocks are in natural (not zig-zag) order.
    495 		b      block
    496 		cb, cr [4]block
    497 		// DC components are delta-encoded.
    498 		prevDCY, prevDCCb, prevDCCr int32
    499 	)
    500 	bounds := m.Bounds()
    501 	switch m := m.(type) {
    502 	// TODO(wathiede): switch on m.ColorModel() instead of type.
    503 	case *image.Gray:
    504 		for y := bounds.Min.Y; y < bounds.Max.Y; y += 8 {
    505 			for x := bounds.Min.X; x < bounds.Max.X; x += 8 {
    506 				p := image.Pt(x, y)
    507 				grayToY(m, p, &b)
    508 				prevDCY = e.writeBlock(&b, 0, prevDCY)
    509 			}
    510 		}
    511 	default:
    512 		rgba, _ := m.(*image.RGBA)
    513 		for y := bounds.Min.Y; y < bounds.Max.Y; y += 16 {
    514 			for x := bounds.Min.X; x < bounds.Max.X; x += 16 {
    515 				for i := 0; i < 4; i++ {
    516 					xOff := (i & 1) * 8
    517 					yOff := (i & 2) * 4
    518 					p := image.Pt(x+xOff, y+yOff)
    519 					if rgba != nil {
    520 						rgbaToYCbCr(rgba, p, &b, &cb[i], &cr[i])
    521 					} else {
    522 						toYCbCr(m, p, &b, &cb[i], &cr[i])
    523 					}
    524 					prevDCY = e.writeBlock(&b, 0, prevDCY)
    525 				}
    526 				scale(&b, &cb)
    527 				prevDCCb = e.writeBlock(&b, 1, prevDCCb)
    528 				scale(&b, &cr)
    529 				prevDCCr = e.writeBlock(&b, 1, prevDCCr)
    530 			}
    531 		}
    532 	}
    533 	// Pad the last byte with 1's.
    534 	e.emit(0x7f, 7)
    535 }
    536 
    537 // DefaultQuality is the default quality encoding parameter.
    538 const DefaultQuality = 75
    539 
    540 // Options are the encoding parameters.
    541 // Quality ranges from 1 to 100 inclusive, higher is better.
    542 type Options struct {
    543 	Quality int
    544 }
    545 
    546 // Encode writes the Image m to w in JPEG 4:2:0 baseline format with the given
    547 // options. Default parameters are used if a nil *Options is passed.
    548 func Encode(w io.Writer, m image.Image, o *Options) error {
    549 	b := m.Bounds()
    550 	if b.Dx() >= 1<<16 || b.Dy() >= 1<<16 {
    551 		return errors.New("jpeg: image is too large to encode")
    552 	}
    553 	var e encoder
    554 	if ww, ok := w.(writer); ok {
    555 		e.w = ww
    556 	} else {
    557 		e.w = bufio.NewWriter(w)
    558 	}
    559 	// Clip quality to [1, 100].
    560 	quality := DefaultQuality
    561 	if o != nil {
    562 		quality = o.Quality
    563 		if quality < 1 {
    564 			quality = 1
    565 		} else if quality > 100 {
    566 			quality = 100
    567 		}
    568 	}
    569 	// Convert from a quality rating to a scaling factor.
    570 	var scale int
    571 	if quality < 50 {
    572 		scale = 5000 / quality
    573 	} else {
    574 		scale = 200 - quality*2
    575 	}
    576 	// Initialize the quantization tables.
    577 	for i := range e.quant {
    578 		for j := range e.quant[i] {
    579 			x := int(unscaledQuant[i][j])
    580 			x = (x*scale + 50) / 100
    581 			if x < 1 {
    582 				x = 1
    583 			} else if x > 255 {
    584 				x = 255
    585 			}
    586 			e.quant[i][j] = uint8(x)
    587 		}
    588 	}
    589 	// Compute number of components based on input image type.
    590 	nComponent := 3
    591 	switch m.(type) {
    592 	// TODO(wathiede): switch on m.ColorModel() instead of type.
    593 	case *image.Gray:
    594 		nComponent = 1
    595 	}
    596 	// Write the Start Of Image marker.
    597 	e.buf[0] = 0xff
    598 	e.buf[1] = 0xd8
    599 	e.write(e.buf[:2])
    600 	// Write the quantization tables.
    601 	e.writeDQT()
    602 	// Write the image dimensions.
    603 	e.writeSOF0(b.Size(), nComponent)
    604 	// Write the Huffman tables.
    605 	e.writeDHT(nComponent)
    606 	// Write the image data.
    607 	e.writeSOS(m)
    608 	// Write the End Of Image marker.
    609 	e.buf[0] = 0xff
    610 	e.buf[1] = 0xd9
    611 	e.write(e.buf[:2])
    612 	e.flush()
    613 	return e.err
    614 }
    615