github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/webp/writer.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 webp
     6  
     7  import (
     8  	"image"
     9  	"image/color"
    10  	"io"
    11  
    12  	image_ext "github.com/chai2010/gopkg/image"
    13  	"github.com/chai2010/gopkg/image/convert"
    14  )
    15  
    16  // Encode writes the image m to w in WEBP format.
    17  func Encode(w io.Writer, m image.Image, opt *Options) (err error) {
    18  	if opt != nil && opt.ColorModel != nil {
    19  		m = convert.ColorModel(m, opt.ColorModel)
    20  	}
    21  	var output []byte
    22  	if opt != nil && opt.Lossless {
    23  		switch m := adjustImage(m).(type) {
    24  		case *image.Gray:
    25  			if output, err = EncodeLosslessGray(m); err != nil {
    26  				return
    27  			}
    28  		case *image_ext.RGB:
    29  			if output, err = EncodeLosslessRGB(m); err != nil {
    30  				return
    31  			}
    32  		case *image.RGBA:
    33  			if output, err = EncodeLosslessRGBA(m); err != nil {
    34  				return
    35  			}
    36  		default:
    37  			panic("image/webp: Encode, unreachable!")
    38  		}
    39  	} else {
    40  		quality := float32(DefaulQuality)
    41  		if opt != nil {
    42  			quality = opt.Quality
    43  		}
    44  		switch m := adjustImage(m).(type) {
    45  		case *image.Gray:
    46  			if output, err = EncodeGray(m, quality); err != nil {
    47  				return
    48  			}
    49  		case *image_ext.RGB:
    50  			if output, err = EncodeRGB(m, quality); err != nil {
    51  				return
    52  			}
    53  		case *image.RGBA:
    54  			if output, err = EncodeRGBA(m, quality); err != nil {
    55  				return
    56  			}
    57  		default:
    58  			panic("image/webp: Encode, unreachable!")
    59  		}
    60  	}
    61  	_, err = w.Write(output)
    62  	return
    63  }
    64  
    65  func adjustImage(m image.Image) image.Image {
    66  	switch m := m.(type) {
    67  	case *image.Gray, *image_ext.RGB, *image.RGBA:
    68  		return m
    69  	default:
    70  		b := m.Bounds()
    71  		rgba := image.NewRGBA(b)
    72  		dstColorRGBA64 := &color.RGBA64{}
    73  		dstColor := color.Color(dstColorRGBA64)
    74  		for y := b.Min.Y; y < b.Max.Y; y++ {
    75  			for x := b.Min.X; x < b.Max.X; x++ {
    76  				pr, pg, pb, pa := m.At(x, y).RGBA()
    77  				dstColorRGBA64.R = uint16(pr)
    78  				dstColorRGBA64.G = uint16(pg)
    79  				dstColorRGBA64.B = uint16(pb)
    80  				dstColorRGBA64.A = uint16(pa)
    81  				rgba.Set(x, y, dstColor)
    82  			}
    83  		}
    84  		return rgba
    85  	}
    86  }