📌Golang📌应用📌image图像处理.txt
"image/color"包实现了基本的颜色库。
Color接口只需实现一个方法: RGBA() (r, g, b, a uint32)
实现了Color接口的结构体类型:
RGBA:代表传统的预乘了alpha通道的32位RGB色彩,Red、Green、Blue、Alpha各8位。
RGBA64:代表预乘了alpha通道的64位RGB色彩,Red、Green、Blue、Alpha各16位。
NRGBA:代表没有预乘alpha通道的32位RGB色彩,Red、Green、Blue、Alpha各8位。
NRGBA64:代表没有预乘alpha通道的64位RGB色彩,Red、Green、Blue、Alpha各16位。
Alpha:代表一个8位的alpha通道(alpha通道表示透明度)。
Alpha16:代表一个16位的alpha通道。
Gray:代表一个8位的灰度色彩。
Gray16:代表一个16位的灰度色彩。
YCbCr:代表完全不透明的24位YCbCr色彩;每个色彩都有1个亮度成分和2个色度成分,分别用8位字节表示。
NYCbCrA:表示非alpha预乘YCbCr带透明度,每个色彩都有1个亮度成分和2个色度成分和alpha透明度,每个具有8位。
CMYK:表示完全不透明的CMYK颜色,青色、品红、黄色和黑色各有8位。
Model接口只需实现一个方法: Convert(c Color) Color
可以将任何颜色转换为其自己的颜色模型。转换可能是有损的。
预定义变量:
RGBAModel RGBA64Model NRGBAModel NRGBA64Model
AlphaModel Alpha16Model GrayModel Gray16Model
YCbCrModel NYCbCrAModel CMYKModel
预定义标准颜色(黑、白、透明、不透明):
var (
Black = Gray16{0}
White = Gray16{0xffff}
Transparent = Alpha16{0}
Opaque = Alpha16{0xffff}
)
func RGBToYCbCr(r, g, b uint8) (uint8, uint8, uint8)
将RGB三原色转换为Y'CbCr三原色。
func YCbCrToRGB(y, cb, cr uint8) (uint8, uint8, uint8)
将Y'CbCr三原色转换为RGB三原色。
func RGBToCMYK(r, g, b uint8) (uint8, uint8, uint8, uint8)
将RGB三元组转换为CMYK四元组。
func CMYKToRGB(c, m, y, k uint8) (uint8, uint8, uint8)
将CMYK四元组转换为RGB三元组。
"image/color/palette"包提供了标准的调色板。
Plan9是256色调色板,将24位RGB空间划分为4×4×4细分。
WebSafe是早期版本的NetscapeNavigator推广的216色调色板。
========== ========== ========== ========== ==========
"image"包实现了基本的2D图片库。
Config类型保管图像的色彩模型和尺寸信息。
type Config struct {
ColorModel color.Model
Width, Height int
}
Image接口表示一个采用某色彩模型的颜色构成的有限矩形网格(即一幅图像)。
type Image interface {
ColorModel() color.Model
Bounds() Rectangle
At(x, y int) color.Color
}
RGBA64Image和PalettedImage是Image接口的扩展。
type RGBA64Image interface {
RGBA64At(x, y int) color.RGBA64
Image
}
type PalettedImage interface {
ColorIndexAt(x, y int) uint8
Image
}
Point类型是X,Y坐标对。坐标轴是向右(X)向下(Y)的。既可以表示点,也可以表示向量。
type Point struct {
X, Y int
}
func Pt(X, Y int) Point //返回Point{X,Y}
Rectangle类型代表一个矩形,左上角坐标为Min,右下角坐标为Max
type Rectangle struct {
Min, Max Point
}
func Rect(x0, y0, x1, y1 int) Rectangle //返回一个矩形Rectangle{Pt(x0,y0),Pt(x1,y1)},如果最小值大于最大值会交换。
func (p Point) String() string //返回坐标的字符串格式如"(3,4)"
func (p Point) Add(q Point) Point //向量p+q
func (p Point) Sub(q Point) Point //向量p-q
func (p Point) Mul(k int) Point //向量p*q
func (p Point) Div(k int) Point //向量p/q
func (p Point) In(r Rectangle) bool //p是否在r范围内
func (p Point) Mod(r Rectangle) Point //返回r范围内的某点q,满足p.X-q.X是r宽度的倍数,p.Y-q.Y是r高度的倍数。
func (p Point) Eq(q Point) bool //p和q是否相等
func (r Rectangle) String() string //返回字符串格式如"(3,4)-(6,5)"
func (r Rectangle) Dx() int //返回r的宽度
func (r Rectangle) Dy() int //返回r的高度
func (r Rectangle) Size() Point //返回r的宽度w和高度h构成的点Point{w,h}。
func (r Rectangle) Add(p Point) Rectangle //返回矩形按p向量平移后的新矩形。
func (r Rectangle) Sub(p Point) Rectangle //返回矩形按p向量反向平移后的新矩形。
func (r Rectangle) Inset(n int) Rectangle //返回去掉矩形四周宽度n的框的矩形,n可为负数。如果n过大将返回靠近r中心位置的空矩形。
func (r Rectangle) Intersect(s Rectangle) Rectangle //返回同时被r和s包含的最大矩形,如果r和s没有重叠会返回Rectangle零值。
func (r Rectangle) Union(s Rectangle) Rectangle //返回同时包含r和s的最小矩形。
func (r Rectangle) Empty() bool //矩形内部是否不包含任何点。
func (r Rectangle) Eq(s Rectangle) bool //两个矩形包含的点是否相同,两个空矩形返回true。
func (r Rectangle) Overlaps(s Rectangle) bool //r和s是否有非空交集
func (r Rectangle) In(s Rectangle) bool //是否r包含的所有点都在s内
func (r Rectangle) Canon() Rectangle //返回矩形的规范版本(左上&右下),必要时会交换坐标的最大值和最小值。
以下方法用于实现Image接口:
func (r Rectangle) At(x, y int) color.Color
func (r Rectangle) RGBA64At(x, y int) color.RGBA64
func (r Rectangle) Bounds() Rectangle
func (r Rectangle) ColorModel() color.Model
RGBA,RGBA64,NRGBA,NRGBA64,Alpha,Alpha16,Gray,Gray16,CMYK,Paletted
等类型代表一幅内存中的图像。
其结构为: struct {
Pix []uint8
Stride int
Rect Rectangle
// Palette
}
Paletted类型还有一个字段 { Palette color.Palette }
以上类型均包含了以下九种方法,都实现了RGBA64Image接口。
func (p *RGBA64) ColorModel() color.Model
func (p *RGBA64) Bounds() Rectangle
func (p *RGBA64) At(x, y int) color.Color
func (p *RGBA64) RGBA64At(x, y int) color.RGBA64
func (p *RGBA64) PixOffset(x, y int) int //返回像素(x, y)的数据起始位置在Pix字段的偏移量/索引。
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 //返回代表原图像一部分(r的范围)的新图像。返回值和原图像的像素数据是共用的。
func (p *RGBA64) Opaque() bool //扫描整个图像并报告图像是否是完全不透明的
以上类型可设置和返回的不同颜色类型的方法:
func (p *RGBA) RGBAAt(x, y int) color.RGBA
func (p *RGBA) SetRGBA(x, y int, c color.RGBA)
func (p *NRGBA) NRGBAAt(x, y int) color.NRGBA
func (p *NRGBA) SetNRGBA(x, y int, c color.NRGBA)
func (p *NRGBA64) NRGBA64At(x, y int) color.NRGBA64
func (p *NRGBA64) SetNRGBA64(x, y int, c color.NRGBA64)
func (p *Alpha) AlphaAt(x, y int) color.Alpha
func (p *Alpha) SetAlpha(x, y int, c color.Alpha)
func (p *Alpha16) Alpha16At(x, y int) color.Alpha16
func (p *Alpha16) SetAlpha16(x, y int, c color.Alpha16)
func (p *Gray) GrayAt(x, y int) color.Gray
func (p *Gray) SetGray(x, y int, c color.Gray)
func (p *Gray16) Gray16At(x, y int) color.Gray16
func (p *Gray16) SetGray16(x, y int, c color.Gray16)
func (p *CMYK) CMYKAt(x, y int) color.CMYK
func (p *CMYK) SetCMYK(x, y int, c color.CMYK)
func (p *Paletted) ColorIndexAt(x, y int) uint8
func (p *Paletted) SetColorIndex(x, y int, index uint8)
创建并返回一个具有指定范围的图像:
func NewRGBA(r Rectangle) *RGBA
func NewRGBA64(r Rectangle) *RGBA64
func NewNRGBA(r Rectangle) *NRGBA
func NewNRGBA64(r Rectangle) *NRGBA64
func NewAlpha(r Rectangle) *Alpha
func NewAlpha16(r Rectangle) *Alpha16
func NewGray(r Rectangle) *Gray
func NewGray16(r Rectangle) *Gray16
func NewCMYK(r Rectangle) *CMYK
func NewPaletted(r Rectangle, p color.Palette) *Paletted
YcbCr代表采用YCbCr色彩模型的一幅内存中的图像。每个像素都对应一个Y采样,但每个Cb/Cr采样对应多个像素。
Ystride是两个垂直相邻的像素之间的Y组分的索引增量。
CStride是两个映射到单独的色度采样的垂直相邻的像素之间的Cb/Cr组分的索引增量。
虽然不作绝对要求,但Ystride字段和len(Y)一般应为8的倍数,并且:
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
}
NYCbCrA是非alpha预乘YCbCrA颜色的内存图像。A和AStride类似于嵌入式YCbCr的Y和YStride字段。
type NYCbCrA struct {
YCbCr
A []uint8
AStride int
}
YcbCr类型(及其扩展类型NYCbCrA)包含以下方法,同样实现了RGBA64Image接口。
func (p *YCbCr) ColorModel() color.Model
func (p *YCbCr) Bounds() Rectangle
func (p *YCbCr) At(x, y int) color.Color
func (p *YCbCr) RGBA64At(x, y int) color.RGBA64
func (p *YCbCr) SubImage(r Rectangle) Image
func (p *YCbCr) Opaque() bool
func (p *YCbCr) YCbCrAt(x, y int) color.YCbCr
func (p *YCbCr) COffset(x, y int) int //像素(X,Y)的Cb或Cr(色度)组分的数据起始位置在Cb/Cr字段的偏移量/索引。
func (p *YCbCr) YOffset(x, y int) int //像素(X,Y)的Y(亮度)组分的数据起始位置在Y字段的偏移量/索引。
NYCbCrA类型覆盖YcbCr类型的方法:
func (p *NYCbCrA) ColorModel() color.Model
func (p *NYCbCrA) At(x, y int) color.Color
func (p *NYCbCrA) RGBA64At(x, y int) color.RGBA64
func (p *NYCbCrA) SubImage(r Rectangle) Image
func (p *NYCbCrA) Opaque() bool
NYCbCrA类型扩展的方法:
func (p *NYCbCrA) NYCbCrAAt(x, y int) color.NYCbCrA
func (p *NYCbCrA) AOffset(x, y int) int //像素(X,Y)相对应的A的第一个元素的索引。
创建并返回一个具有指定宽度、高度和二次采样率的内存图像:
func NewYCbCr(r Rectangle, subsampleRatio YCbCrSubsampleRatio) *YCbCr
func NewNYCbCrA(r Rectangle, subsampleRatio YCbCrSubsampleRatio) *NYCbCrA
Uniform类型代表一块面积无限大的具有同一色彩的图像。它实现了color.Color、color.Model和Image等接口。
type Uniform struct {
C color.Color
}
func NewUniform(c color.Color) *Uniform
func (c *Uniform) RGBA() (r, g, b, a uint32)
func (c *Uniform) ColorModel() color.Model
func (c *Uniform) Convert(color.Color) color.Color
func (c *Uniform) Bounds() Rectangle
func (c *Uniform) At(x, y int) color.Color
func (c *Uniform) RGBA64At(x, y int) color.RGBA64
func (c *Uniform) Opaque() bool
预定义变量
var (
Black = NewUniform(color.Black) //一个完全不透明的面积无限大的黑色图像
White = NewUniform(color.White) //一个完全不透明的面积无限大的白色图像
Transparent = NewUniform(color.Transparent) //一个完全透明的面积无限大的图像
Opaque = NewUniform(color.Opaque) //一个完全不透明的面积无限大的图像
)
解码任何具体图像类型之前都必须注册对应类型的解码函数。注册过程一般是作为包初始化的副作用,放在包的init函数里。
因此,要解码PNG图像,只需在程序的包里嵌入如下代码:
import _ "image/png"
func RegisterFormat(name, magic string, decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error))
注册一个供Decode函数使用的图片格式。name是格式的名字,如"jpeg"或"png";
magic是该格式编码的魔术前缀,该字符串可以包含"?"通配符,每个通配符匹配一个字节;
decode函数用于解码图片;decodeConfig函数只解码图片的配置。
func Decode(r io.Reader) (Image, string, error)
func DecodeConfig(r io.Reader) (Config, string, error)
解码并返回一个采用某种已注册格式编码的图像的色彩模型和尺寸。
字符串返回值是该格式注册时的名字。格式一般是在该编码格式的包的init函数中注册的。
========== ========== ========== ========== ==========
"image/gif"包实现了gif图片的编解码。包的初始函数会注册gif解码函数:
image.RegisterFormat("gif", "GIF8?a", Decode, DecodeConfig)
GIF类型代表可能保存在GIF文件里的多幅图像。
type GIF struct {
Image []*image.Paletted
Delay []int
LoopCount int
Disposal []byte
Config image.Config
BackgroundIndex byte
}
Options类型是编码参数。
type Options struct {
NumColors int //图像中的最多颜色数,范围[1,256]
Quantizer draw.Quantizer //用于生成NumColors大小的调色板,为nil时默认使用palette.Plan9
Drawer draw.Drawer //用于将图像写入期望的调色板格式的图像,为nil时会使用draw.FloydSteinberg
}
func DecodeConfig(r io.Reader) (image.Config, error)
返回GIF图像的色彩模型和尺寸;函数不会解码整个图像文件。
func Decode(r io.Reader) (image.Image, error)
从文件流解码并返回GIF文件中的第一幅图像。
func DecodeAll(r io.Reader) (*GIF, error)
从r中读取一个GIF格式文件;返回值中包含了连续的图帧和时间信息。
func Encode(w io.Writer, m image.Image, o *Options) error
将图像以GIF格式写入w中。
func EncodeAll(w io.Writer, g *GIF) error
将g中所有的图像按指定的每帧延迟和累计循环时间写入w中。
========== ========== ========== ========== ==========
"image/jpeg"包实现了jpeg图像的编解码。包的初始函数会注册jpeg解码函数:
image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
Options是编码质量参数。Quality取值范围[1,100],越大图像编码质量越高。
type Options struct {
Quality int
}
const DefaultQuality = 75 //默认质量参数
func DecodeConfig(r io.Reader) (image.Config, error)
返回JPEG图像的色彩模型和尺寸;函数不会解码整个图像。
func Decode(r io.Reader) (image.Image, error)
从r读取一幅jpeg格式的图像并解码返回该图像。
func Encode(w io.Writer, m image.Image, o *Options) error
Encode函数将采用JPEG 4:2:0基线格式和指定的编码质量将图像写入w。如果o为nil将使用DefaultQuality。
========== ========== ========== ========== ==========
"image/png"包实现了png图像的编码和解码。包的初始函数会注册png解码函数:
image.RegisterFormat("png", "\x89PNG\r\n\x1a\n", Decode, DecodeConfig)
func DecodeConfig(r io.Reader) (image.Config, error)
返回PNG图像的色彩模型和尺寸;函数不会解码整个图像。
func Decode(r io.Reader) (image.Image, error)
从r读取一幅png格式的图像并解码返回该图像。
func Encode(w io.Writer, m image.Image) error
将图像m以PNG格式写入w。
任意图像类型都可以被编码,但image.NRGBA以外格式的图像可能会在编码时丢失一些图像信息。
========== ========== ========== ========== ==========
"image/draw"包提供组装图片的方法。
Image接口比image.Image接口多了Set方法,用于修改单个像素的色彩。
type Image interface {
image.Image
Set(x, y int, c color.Color)
}
RGBA64Image接口比image.RGBA64Image多了用于修改单个像素色彩的Set和SetRGBA64方法。
type RGBA64Image interface {
image.RGBA64Image
Set(x, y int, c color.Color)
SetRGBA64(x, y int, c color.RGBA64)
}
Quantizer接口为一个图像生成调色板。
type Quantizer interface {
Quantize(p color.Palette, m image.Image) color.Palette
}
Drawer接口包含Draw方法:对齐图像dst的r.Min和src的sp点,然后将src绘制到dst上的结果来替换矩形范围内的图像。
type Drawer interface {
Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point)
}
type Op int //Op是Porter-Duff合成的操作符。
常量定义:
Over Op = iota //源图像透过遮罩后,覆盖在目标图像上(类似图层)
Src //源图像透过遮罩后,替换掉目标图像
func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point)
通过使用Op参数调用包的Draw函数实现了Drawer接口。
预定义变量FloydSteinberg是采用Src操作并实现了Floyd-Steinberg误差扩散算法的Drawer。
func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op)
对齐目标图像dst的矩形r左上角、源图像src的sp点、遮罩mask的mp点,根据op修改dst的r矩形区域内的内容,mask如果为nil则视为完全透明。
func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)
使用nil的mask参数调用DrawMask函数。