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  }