這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
jpeg包實現了jpeg圖片的編碼和解碼
func Decode(r io.Reader) (image.Image, error) //Decode讀取一個jpeg檔案,並將他作為image.Image返回
func DecodeConfig(r io.Reader) (image.Config, error) //無需解碼整個映像,DecodeConfig變能夠返回整個映像的尺寸和顏色(Config具體定義查看gif包中的定義)
func Encode(w io.Writer, m image.Image, o *Options) error //按照4:2:0的基準格式將image寫入w中,如果options為空白的話,則傳遞預設參數
type Options struct {Quality int}
Options是編碼參數,它的取值範圍是1-100,值越高品質越好
type FormatError //用來報告一個輸入不是有效jpeg格式
type FormatError string
func (e FormatError) Error() string
type Reader //不推薦使用Reader
type Reader interface {io.ByteReaderio.Reader}
type UnsupportedError
func (e UnsupportedError) Error() string //報告輸入使用一個有效但是未實現的jpeg功能
利用程式畫一條直線,代碼如下:
package mainimport ("fmt""image""image/color""image/jpeg""math""os")const (dx = 500dy = 300)type Putpixel func(x, y int)func drawline(x0, y0, x1, y1 int, brush Putpixel) {dx := math.Abs(float64(x1 - x0))dy := math.Abs(float64(y1 - y0))sx, sy := 1, 1if x0 >= x1 {sx = -1}if y0 >= y1 {sy = -1}err := dx - dyfor {brush(x0, y0)if x0 == x1 && y0 == y1 {return}e2 := err * 2if e2 > -dy {err -= dyx0 += sx}if e2 < dx {err += dxy0 += sy}}}func main() {file, err := os.Create("test.jpg")if err != nil {fmt.Println(err)}defer file.Close()nrgba := image.NewNRGBA(image.Rect(0, 0, dx, dy))drawline(1, 1, dx-2, dy-2, func(x, y int) {nrgba.Set(x, y, color.RGBA{uint8(x), uint8(y), 0, 255})})for y := 0; y < dy; y++ {nrgba.Set(1, y, color.White)nrgba.Set(dx-1, y, color.White)}err = jpeg.Encode(file, nrgba, &jpeg.Options{100}) //映像品質值為100,是最好的映像顯示if err != nil {fmt.Println(err)}}
根據已經得到的映像test.jpg,我們建立一個新的映像test1.jpg
package mainimport ("fmt""image/jpeg""os")func main() {file, err := os.Open("test.jpg")if err != nil {fmt.Println(err)}defer file.Close()file1, err := os.Create("test1.jpg")if err != nil {fmt.Println(err)}defer file1.Close()img, err := jpeg.Decode(file) //解碼if err != nil {fmt.Println(err)}jpeg.Encode(file1, img, &jpeg.Options{5}) //編碼,但是將映像品質從100改成5}
對比映像品質為100和5的映像:
品質為100的映像
品質為5的映像
image/png包用法:
image/png實現了png映像的編碼和解碼
png和jpeg實現方法基本相同,都是對映像進行了編碼和解碼操作。
func Decode(r io.Reader) (image.Image, error) //Decode從r中讀取一個圖片,並返回一個image.image,返回image類型取決於png圖片的內容
func DecodeConfig(r io.Reader) (image.Config, error) //無需解碼整個映像變能夠擷取整個圖片的尺寸和顏色
func Encode(w io.Writer, m image.Image) error //Encode將圖片m以PNG的格式寫到w中。任何圖片都可以被編碼,但是哪些不是image.NRGBA的圖片編碼可能是有損的。
type FormatError
func (e FormatError) Error() string //FormatError會提示一個輸入不是有效PNG的錯誤。
type UnsupportedError
func (e UnsupportedError) Error() string //UnsupportedError會提示輸入使用一個合法的,但是未實現的PNG特性。
利用png包實現一個png的映像,代碼如下:
package mainimport ("fmt""image""image/color""image/png""os")const (dx = 256dy = 256)func Pic(dx, dy int) [][]uint8 {pic := make([][]uint8, dx)for i := range pic {pic[i] = make([]uint8, dy)for j := range pic[i] {pic[i][j] = uint8(i * j % 255)}}return pic}func main() {file, err := os.Create("test.png")if err != nil {fmt.Println(err)}defer file.Close()rgba := image.NewRGBA(image.Rect(0, 0, dx, dy))for x := 0; x < dx; x++ {for y := 0; y < dy; y++ {rgba.Set(x, y, color.RGBA{uint8(x * y % 255), uint8(x * y % 255), 0, 255})}}err = png.Encode(file, rgba)if err != nil {fmt.Println(err)}}
映像如下:
由此可見,png和jpeg使用方法類似,只是兩種不同的編碼和解碼方式。
參考:
蟈蟈俊的部落格:http://www.cnblogs.com/ghj1976/p/3441536.html
golang技術官網:http://docscn.studygolang.com/pkg/image/jpeg/