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