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 }