zoukankan      html  css  js  c++  java
  • golang中image包用法

    image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在image/color中描述,

    image接口的值创建方式有如下几种:

    1调用NewRGBA和NewPaletted

    2解码一个包含gif.jpen或者png格式的image数据的io.Reader

    首先介绍一些image接口


    type Image    //image是一个从颜色模型中采取color.Color的矩形网格

    type Image interface {
    	ColorModel() color.Model //ColorModel 返回图片的 color.Model
    	Bounds() Rectangle    //图片中非0color的区域
    	At(x, y int) color.Color  //返回指定点的像素color.Color
    }
    任何一个struct只要实现了image中的三个方法,便实现了image接口

    func Decode(r io.Reader) (Image, string, error) //Decode对一个根据指定格式进行编码的图片进行解码操作,string返回的是在注册过程中使用的格式化名字,如"gif"或者"jpeg"等.


    func RegisterFormat(name, magic string, decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error))

    RegisterFormat注册一个image格式给解码使用,name是格式化名字,例如"jpeg"或者"png",magic标明格式化编码的前缀,magic字符串中能够包含一个?字符,用来匹配任何一个字符,decode是用来解码"编码图像"的函数,DecodeConfig是一个仅仅解码它的配置的函数.


    type Alpha //用来设置图片的透明度

    type Alpha struct {
    	
    	Pix []uint8  // Pix 存储图片的像素 ,像 alpha 值. 在(X,Y)的像素 starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
    	
    	Stride int          // Stride 表示垂直两个像素之间的步幅(距离)
    
    	Rect Rectangle  // Rect 表示 图片边界.
    }


    func NewAlpha(r Rectangle) *Alpha       //利用给定矩形边界产生一个alpha
    func (p *Alpha) AlphaAt(x, y int) color.Alpha      //获取指定点的透明度
    func (p *Alpha) At(x, y int) color.Color   //获取指定点的color(指定点的红绿蓝的透明度)
    func (p *Alpha) Bounds() Rectangle   //获取alpha的边界
    func (p *Alpha) ColorModel() color.Model //获取alpha的颜色模型
    func (p *Alpha) Opaque() bool      //检查alpha是否完全不透明
    func (p *Alpha) PixOffset(x, y int) int   //获取指定像素相对于第一个像素的相对偏移量
    func (p *Alpha) Set(x, y int, c color.Color) //设定指定位置的color
    func (p *Alpha) SetAlpha(x, y int, c color.Alpha)  //设定指定位置的alpha

    func (p *Alpha) SubImage(r Rectangle) Image   //获取p图像中被r覆盖的子图像,父图像和子图像公用像素

    下面举例说明其用法:

    package main
    
    import (
    	"fmt"
    	"image"
    	"image/color"
    	"image/jpeg"
    	"log"
    	"os"
    )
    
    const (
    	dx = 500
    	dy = 200
    )
    
    func main() {
    
    	file, err := os.Create("test.jpeg")
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer file.Close()
    	alpha := image.NewAlpha(image.Rect(0, 0, dx, dy))
    	for x := 0; x < dx; x++ {
    		for y := 0; y < dy; y++ {
    			alpha.Set(x, y, color.Alpha{uint8(x % 256)})   //设定alpha图片的透明度
    		}
    	}
    
    	fmt.Println(alpha.At(400, 100))    //144 在指定位置的像素
    	fmt.Println(alpha.Bounds())        //(0,0)-(500,200),图片边界
    	fmt.Println(alpha.Opaque())        //false,是否图片完全透明
    	fmt.Println(alpha.PixOffset(1, 1)) //501,指定点相对于第一个点的距离
    	fmt.Println(alpha.Stride)          //500,两个垂直像素之间的距离
    	jpeg.Encode(file, alpha, nil)      //将image信息写入文件中
    }
    

    得到的图形如下所示:



    由于每种类型其方法类似,下面不再距离说明。

    type Alpha16

    type Alpha16 struct {
    	// Pix holds the image's pixels, as alpha values in big-endian format. The pixel at
    	// (x, y) starts at <span style="color:#FF0000;">Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2]</span>. 大端模式,所以像素计算和alpha不同
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }
    
    其中alpha16中方法用法与alpha中方法用法类似,这里不再赘述.
    func NewAlpha16(r Rectangle) *Alpha16
    func (p *Alpha16) Alpha16At(x, y int) color.Alpha16
    func (p *Alpha16) At(x, y int) color.Color
    func (p *Alpha16) Bounds() Rectangle
    func (p *Alpha16) ColorModel() color.Model
    func (p *Alpha16) Opaque() bool
    func (p *Alpha16) PixOffset(x, y int) int
    func (p *Alpha16) Set(x, y int, c color.Color)
    func (p *Alpha16) SetAlpha16(x, y int, c color.Alpha16)
    func (p *Alpha16) SubImage(r Rectangle) Image



    type Config //包括图像的颜色模型和宽高尺寸

    type Config struct {
    	ColorModel    color.Model
    	Width, Height int
    }


    func DecodeConfig(r io.Reader) (Config, string, error)


    type Gray  //用来设置图片的灰度

    type Gray struct {
    	// Pix holds the image's pixels, as gray values. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }
    其中Gray方法与Alpha完全相同,不在赘述

    func NewGray(r Rectangle) *Gray
    func (p *Gray) At(x, y int) color.Color
    func (p *Gray) Bounds() Rectangle
    func (p *Gray) ColorModel() color.Model
    func (p *Gray) GrayAt(x, y int) color.Gray
    func (p *Gray) Opaque() bool
    func (p *Gray) PixOffset(x, y int) int
    func (p *Gray) Set(x, y int, c color.Color)
    func (p *Gray) SetGray(x, y int, c color.Gray)
    func (p *Gray) SubImage(r Rectangle) Image


    type Gray16

    type Gray16 struct {
    	// Pix holds the image's pixels, as gray values in big-endian format. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2].
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }
    
    Gray16方法与Alpha16方法完全相同,不再赘述
    func NewGray16(r Rectangle) *Gray16
    func (p *Gray16) At(x, y int) color.Color
    func (p *Gray16) Bounds() Rectangle
    func (p *Gray16) ColorModel() color.Model
    func (p *Gray16) Gray16At(x, y int) color.Gray16
    func (p *Gray16) Opaque() bool
    func (p *Gray16) PixOffset(x, y int) int
    func (p *Gray16) Set(x, y int, c color.Color)
    func (p *Gray16) SetGray16(x, y int, c color.Gray16)
    func (p *Gray16) SubImage(r Rectangle) Image


    type NRGBA

    type NRGBA struct {
    	// Pix holds the image's pixels, in R, G, B, A order. The pixel at
    	// (x, y) starts at <span style="color:#FF0000;">Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4]</span>.
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }

    func NewNRGBA(r Rectangle) *NRGBA
    func (p *NRGBA) At(x, y int) color.Color
    func (p *NRGBA) Bounds() Rectangle
    func (p *NRGBA) ColorModel() color.Model
    func (p *NRGBA) NRGBAAt(x, y int) color.NRGBA
    func (p *NRGBA) Opaque() bool
    func (p *NRGBA) PixOffset(x, y int) int
    func (p *NRGBA) Set(x, y int, c color.Color)
    func (p *NRGBA) SetNRGBA(x, y int, c color.NRGBA)
    func (p *NRGBA) SubImage(r Rectangle) Image


    type NRGBA64

    type NRGBA64 struct {
    	// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }
    

    func NewNRGBA64(r Rectangle) *NRGBA64
    func (p *NRGBA64) At(x, y int) color.Color
    func (p *NRGBA64) Bounds() Rectangle
    func (p *NRGBA64) ColorModel() color.Model
    func (p *NRGBA64) NRGBA64At(x, y int) color.NRGBA64
    func (p *NRGBA64) Opaque() bool
    func (p *NRGBA64) PixOffset(x, y int) int
    func (p *NRGBA64) Set(x, y int, c color.Color)
    func (p *NRGBA64) SetNRGBA64(x, y int, c color.NRGBA64)
    func (p *NRGBA64) SubImage(r Rectangle) Image



    type Paletted

    type Paletted struct {
    	// Pix holds the image's pixels, as palette indices. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    	// Palette is the image's palette. 图片的调色板
    	Palette color.Palette
    }

    func NewPaletted(r Rectangle, p color.Palette) *Paletted  //根据指定的宽高和颜色调色板生成一个新的调色板
    func (p *Paletted) At(x, y int) color.Color
    func (p *Paletted) Bounds() Rectangle
    func (p *Paletted) ColorIndexAt(x, y int) uint8
    func (p *Paletted) ColorModel() color.Model
    func (p *Paletted) Opaque() bool
    func (p *Paletted) PixOffset(x, y int) int
    func (p *Paletted) Set(x, y int, c color.Color)
    func (p *Paletted) SetColorIndex(x, y int, index uint8)
    func (p *Paletted) SubImage(r Rectangle) Image


    type PalettedImage  //调色板图像接口

    type PalettedImage interface {
    	
    	ColorIndexAt(x, y int) uint8 //返回在位置(x,y)处像素的索引
    	Image  //image接口
    }
    


    type Point //一个点的(x,y)坐标对

    type Point struct {
    	X, Y int
    }
    

    func Pt(X, Y int) Point      //Pt是Point{X, Y}的简写
    func (p Point) Add(q Point) Point  //两个向量点求和
    func (p Point) Div(k int) Point   //Div returns the vector p/k,求Point/k的值
    func (p Point) Eq(q Point) bool   //判定两个向量点是否相等
    func (p Point) In(r Rectangle) bool //判断某个向量点是否在矩阵中
    func (p Point) Mod(r Rectangle) Point    //在矩阵r中求一个点q,是的p.x-q.x是矩阵宽的倍数,p.y-q.y是矩阵高的倍数
    func (p Point) Mul(k int) Point   //返回向量点和指定值的乘积组成的向量点
    func (p Point) String() string    //返回用string表示的向量点,其样式如(1,2)

    func (p Point) Sub(q Point) Point      //两个向量点求差

    举例说明如下:

    func main() {
    	pt := image.Point{X: 5, Y: 5}
    	fmt.Println(pt)            //(5,5) ,输出一个点位置(X,Y)
    	fmt.Println(image.Pt(1, 2))   //(1,2)  ,Pt输出一个点位置的简写形式
    	fmt.Println(pt.Add(image.Pt(1, 1)))  //(6,6),两个点求和
    	fmt.Println(pt.String())      //(5,5) ,以字符串形式输出点
    	fmt.Println(pt.Eq(image.Pt(5, 5)))        //true,判断两个点是否完全相等
    	fmt.Println(pt.In(image.Rect(0, 0, 10, 10)))    //true,判断一个点是否在矩阵中
    	fmt.Println(pt.Div(2))          //(2,2),求点的商
     	fmt.Println(pt.Mul(2))             // (10,10),求点的乘积
    	fmt.Println(pt.Sub(image.Pt(1, 1)))     // (4,4),求两个点的差<pre name="code" class="html"> 	fmt.Println(pt.Mod(image.Rect(9, 8, 10, 10)))  // (9,9),dx=10-9=1,dy=10-8=2,9-5=4,4是1和2的倍数并且(9,9)在矩阵中
    }

    
    

    type RGBA

    type RGBA struct {
    	// Pix holds the image's pixels, in R, G, B, A order. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*4]
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }

    func NewRGBA(r Rectangle) *RGBA
    func (p *RGBA) At(x, y int) color.Color
    func (p *RGBA) Bounds() Rectangle
    func (p *RGBA) ColorModel() color.Model
    func (p *RGBA) Opaque() bool
    func (p *RGBA) PixOffset(x, y int) int
    func (p *RGBA) Set(x, y int, c color.Color)
    func (p *RGBA) SetRGBA(x, y int, c color.RGBA)

    func (p *RGBA) SubImage(r Rectangle) Image

    举例说明RGBA用法:

    package main
    
    import (
    	"fmt"
    	"image"
    	"image/color"
    	"image/jpeg"
    	"log"
    	"os"
    )
    
    const (
    	dx = 500
    	dy = 200
    )
    
    func main() {
    
    	file, err := os.Create("test.jpg")
    	if err != nil {
    		log.Fatal(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.NRGBA{uint8(x % 256), uint8(y % 256), 0, 255})
    		}
    	}
    
    	fmt.Println(rgba.At(400, 100))    //{144 100 0 255}
    	fmt.Println(rgba.Bounds())        //(0,0)-(500,200)
    	fmt.Println(rgba.Opaque())        //true,其完全透明
    	fmt.Println(rgba.PixOffset(1, 1)) //2004
    	fmt.Println(rgba.Stride)          //2000
    	jpeg.Encode(file, rgba, nil)      //将image信息存入文件中
    }

    得到的文件如下;



    type RGBA64

    type RGBA64 struct {
    	// Pix holds the image's pixels, in R, G, B, A order and big-endian format. The pixel at
    	// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*8].
    	Pix []uint8
    	// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
    	Stride int
    	// Rect is the image's bounds.
    	Rect Rectangle
    }

    func NewRGBA64(r Rectangle) *RGBA64
    func (p *RGBA64) At(x, y int) color.Color
    func (p *RGBA64) Bounds() Rectangle
    func (p *RGBA64) ColorModel() color.Model
    func (p *RGBA64) Opaque() bool
    func (p *RGBA64) PixOffset(x, y int) int
    func (p *RGBA64) RGBA64At(x, y int) color.RGBA64
    func (p *RGBA64) Set(x, y int, c color.Color)
    func (p *RGBA64) SetRGBA64(x, y int, c color.RGBA64)
    func (p *RGBA64) SubImage(r Rectangle) Image


    type Rectangle   //利用两个坐标点来生成矩阵

    type Rectangle struct {
    	Min, Max Point
    }

    func Rect(x0, y0, x1, y1 int) Rectangle //Rect是Rectangle{Pt(x0, y0), Pt(x1, y1)}的一种简写形式
    func (r Rectangle) Add(p Point) Rectangle //矩阵中两个点都与指定的点求和组成一个新的矩阵
    func (r Rectangle) Canon() Rectangle  //返回标准格式的矩形,如果有必要的话,会进行最小值坐标和最大坐标的交换
    func (r Rectangle) Dx() int       //返回矩阵宽度dx
    func (r Rectangle) Dy() int       //返回矩阵高度dy
    func (r Rectangle) Empty() bool              //判定是否该矩阵为空,即不包含任何point
    func (r Rectangle) Eq(s Rectangle) bool    //判断两个矩阵是否相等,指的是完全重合
    func (r Rectangle) In(s Rectangle) bool  //判断一个矩阵是否在另外一个矩阵之内

    func (r Rectangle) Inset(n int) Rectangle //返回根据n算出的嵌入的矩阵,计算方法是矩阵的每个坐标都减去n,求得的矩阵必须在已知矩阵内嵌,如果没有的话则返回空矩阵
    func (r Rectangle) Intersect(s Rectangle) Rectangle     //求两个矩阵的相交矩阵,如果两个矩阵不相交,则返回0矩阵
    func (r Rectangle) Overlaps(s Rectangle) bool  //判断两个矩阵是否有交集,即判断两个矩阵是否有公共区域
    func (r Rectangle) Size() Point       //返回矩阵的宽和高,即dx和dy
    func (r Rectangle) String() string                         //返回矩阵的字符串表示
    func (r Rectangle) Sub(p Point) Rectangle  //一个矩阵的两个坐标点同时减去一个指定的坐标点p,得到的一个新的矩阵
    func (r Rectangle) Union(s Rectangle) Rectangle //两个矩阵的并集,这个是和Intersect(求两个矩阵的交集)相对的


    举例说明Rectangle用法:

    package main
    
    import (
    	"fmt"
    	"image"
    )
    
    func main() {
    	rt := image.Rect(0, 0, 100, 50)
    	rt1 := image.Rect(100, 100, 10, 10)
    
    	fmt.Println(rt1.Canon())      //(10,10)-(100,100),rt1大小坐标交换位置
    	fmt.Println(rt, rt1)          //(0,0)-(100,50) (10,10)-(100,100)
    	fmt.Println(rt.Dx(), rt.Dy()) //100 50,返回矩阵的宽度和高度
    	fmt.Println(rt.Empty())       //false,矩阵是否为空
    	fmt.Println(rt.Eq(rt1))       //false,两个矩阵是否相等
    	fmt.Println(rt.In(rt1))       //false,矩阵rt是否在矩阵rt1中
    	fmt.Println(rt.Inset(10))     //(10,10)-(90,40),查找内嵌矩阵,用原矩阵坐标点减去给定的值10得到的矩阵,该矩阵必须是原矩阵的内嵌矩阵
    
    	if rt.Overlaps(rt1) {
    		fmt.Println(rt.Intersect(rt1)) //(10,10)-(100,50) //求两个矩阵的交集
    	}
    	fmt.Println(rt.Size())                //(100,50),求矩阵大小,其等价与(dx,dy)
    	fmt.Println(rt.String())              //  (0,0)-(100,50)
    	fmt.Println(rt.Sub(image.Pt(10, 10))) // (-10,-10)-(90,40),求矩阵和一个点的差,用于将矩阵进行移位操作
    	fmt.Println(rt.Union(rt1))            //(0,0)-(100,100),求两个矩阵的并集
    }

    type Uniform     //Uniform是一个具有统一颜色无穷大小的图片,它实现了color.Color, color.Model, 以及 Image的接口

    type Uniform struct {
    	C color.Color
    }

    func NewUniform(c color.Color) *Uniform  //根据color.Color产生一个Uniform
    func (c *Uniform) At(x, y int) color.Color             //获取指定点的像素信息
    func (c *Uniform) Bounds() Rectangle    //获取图像的边界矩阵信息
    func (c *Uniform) ColorModel() color.Model  //获取图像的颜色模型
    func (c *Uniform) Convert(color.Color) color.Color //将图片的像素信息转换为另外一种指定的像素信息
    func (c *Uniform) Opaque() bool         //判定图片是否完全透明
    func (c *Uniform) RGBA() (r, g, b, a uint32)    //返回图片的r,g,b,a(红,绿,蓝,透明度)的值


    type YCbCr  //YCbCr是一个Y'CbCr颜色的图片,每个Y样本表示一个像素,但是每个Cb和Cr能够代表一个或者更多的像素,YStride是在相邻垂直像素的Yslice索引增         //量,CStride是Cb和 Cr slice在相邻垂直像素(映射到独立色度采样)的索引增量.通常YStride和len(Y)是8的倍数,而CStride结果如下:

    For 4:4:4, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/1.
    For 4:2:2, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/2.
    For 4:2:0, CStride == YStride/2 && len(Cb) == len(Cr) == len(Y)/4.
    For 4:4:0, CStride == YStride/1 && len(Cb) == len(Cr) == len(Y)/2.

    type YCbCr struct {
    	Y, Cb, Cr      []uint8
    	YStride        int
    	CStride        int
    	SubsampleRatio YCbCrSubsampleRatio
    	Rect           Rectangle
    }

    func NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio) *YCbCr //通过给定边界和子样本比例创建新的YCbCr
    func (p *YCbCr) At(x, y int) color.Color     //获取指定点的像素
    func (p *YCbCr) Bounds() Rectangle     //获取图像边界
    func (p *YCbCr) COffset(x, y int) int       //获取指定点相对于第一个Cb元素的像素点的相对位置
    func (p *YCbCr) ColorModel() color.Model    //获取颜色Model
    func (p *YCbCr) Opaque() bool                              //判定是否完全透明
    func (p *YCbCr) SubImage(r Rectangle) Image  //根据指定矩阵获取原图像的子图像
    func (p *YCbCr) YCbCrAt(x, y int) color.YCbCr  
    func (p *YCbCr) YOffset(x, y int) int       //获取相对于第一个Y元素的像素点的相对位置


    type YCbCrSubsampleRatio //YCbCr的色度子样本比例,常用于NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio)中用来创建YCbCr

    const (
    	YCbCrSubsampleRatio444 YCbCrSubsampleRatio = iota
    	YCbCrSubsampleRatio422
    	YCbCrSubsampleRatio420
    	YCbCrSubsampleRatio440
    )


    func (s YCbCrSubsampleRatio) String() string //YCbCrSubsampleRatio结构的字符串表示

     
  • 相关阅读:
    Android中NFC编程
    动态的改变程序的主题
    第二章 Libgdx的目标和特性
    第一章 Libgdx简介
    JAVA过滤器和拦截器的区别(个人理解)
    Android下Activity的生命周期
    Ext JS 4.2.1 Beta 1发布了
    【翻译】Ext JS 4.2介绍
    jQuery 1.5发布 Ajax模块重写
    ASP.NET 服务器控件渲染到客户端之后对应的HTML标签
  • 原文地址:https://www.cnblogs.com/msnsj/p/4242572.html
Copyright © 2011-2022 走看看