github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jpeg/jpeg.go (about) 1 // Copyright 2014 <chaishushan{AT}gmail.com>. 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 implements a JPEG image decoder and encoder. 6 // 7 // JPEG is defined in ITU-T T.81: http://www.w3.org/Graphics/JPEG/itu-t81.pdf. 8 package jpeg 9 10 import ( 11 "image" 12 "image/color" 13 "image/jpeg" 14 "io" 15 16 image_ext "github.com/chai2010/gopkg/image" 17 "github.com/chai2010/gopkg/image/convert" 18 ) 19 20 // Options are the encoding and decoding parameters. 21 type Options struct { 22 *jpeg.Options 23 ColorModel color.Model 24 } 25 26 // DecodeConfig returns the color model and dimensions of a JPEG image without 27 // decoding the entire image. 28 func DecodeConfig(r io.Reader) (config image.Config, err error) { 29 return jpeg.DecodeConfig(r) 30 } 31 32 // Decode reads a JPEG image from r and returns it as an image.Image. 33 func Decode(r io.Reader, opt *Options) (m image.Image, err error) { 34 if m, err = jpeg.Decode(r); err != nil { 35 return 36 } 37 if opt != nil && opt.ColorModel != nil { 38 m = convert.ColorModel(m, opt.ColorModel) 39 } 40 return 41 } 42 43 // Encode writes the Image m to w in JPEG 4:2:0 baseline format with the given 44 // options. Default parameters are used if a nil *Options is passed. 45 func Encode(w io.Writer, m image.Image, opt *Options) error { 46 if opt != nil && opt.ColorModel != nil { 47 m = convert.ColorModel(m, opt.ColorModel) 48 } 49 if opt != nil && opt.Options != nil { 50 return jpeg.Encode(w, m, opt.Options) 51 } else { 52 return jpeg.Encode(w, m, nil) 53 } 54 } 55 56 func imageExtDecode(r io.Reader, opt interface{}) (image.Image, error) { 57 if opt, ok := opt.(*Options); ok { 58 return Decode(r, opt) 59 } else { 60 return Decode(r, nil) 61 } 62 } 63 64 func imageExtEncode(w io.Writer, m image.Image, opt interface{}) error { 65 if opt, ok := opt.(*Options); ok { 66 return Encode(w, m, opt) 67 } else { 68 return Encode(w, m, nil) 69 } 70 } 71 72 func init() { 73 image_ext.RegisterFormat(image_ext.Format{ 74 Name: "jpeg", 75 Extensions: []string{".jpeg", ".jpg"}, 76 Magics: []string{"\xff\xd8"}, 77 DecodeConfig: DecodeConfig, 78 Decode: imageExtDecode, 79 Encode: imageExtEncode, 80 }) 81 }