...

Source file src/image/jpeg/writer.go

Documentation: image/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 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