golang中image-color包的用法


原文链接: golang中image-color包的用法

golang中image/color包的用法

color包是image包对于color重点介绍,实现了基本的颜色库

color中定义了如下几个变量

var (
    Black       = Gray16{0}
    White       = Gray16{0xffff}
    Transparent = Alpha16{0}
    Opaque      = Alpha16{0xffff}
)

func RGBToYCbCr(r, g, b uint8) (uint8, uint8, uint8) //RGBToYCbCr将RGB的三重色转换为Y'CbCr模型的三重色
func YCbCrToRGB(y, cb, cr uint8) (uint8, uint8, uint8)  //YCbCrToRGB将Y'CbCr上的三重色转变成RGB的三重色。

type Alpha       //Alpha代表一个8-bit的透明度。

type Alpha struct {
    A uint8
}

func (c Alpha) RGBA() (r, g, b, a uint32)

type Alpha16       //Alpha16代表一个16位的透明度。

type Alpha16 struct {
    A uint16
}

func (c Alpha16) RGBA() (r, g, b, a uint32)

预乘简单定义(预乘会在后面的定义中用到):

什么是预乘?假设一个像素点,用RGBA四个分量来表示,记做(R,G,B,A),那预乘后的像素就是(R*A,G*A,B*A, A),这里A的取值范围是[0,1]。所以,预乘就是每个颜色分量都与该像素的alpha分量预先相乘。可以发现,对于一个没有透明度,或者说透明度为1的像素来说,预乘不预乘结果都是一样的。

type Color      //Color可以将它自己转化成每个RGBA通道都预乘透明度。这种转化可能是有损的。任何实现RGBA()方法的结构体都实现了Color接口

type Color interface {

    // RGBA返回预乘透明度的红,绿,蓝和颜色的透明度。每个值都在[0, 0xFFFF]范围内,
    // 但是每个值都被uint32代表,这样可以乘以一个综合值来保证不会达到0xFFFF而溢出。
    RGBA() (r, g, b, a uint32)
}

type Gray     //Gray代表一个8-bit的灰度。

type Gray struct {
    Y uint8
}

func (c Gray) RGBA() (r, g, b, a uint32)

type Gray16         //Gray16代表了一个16-bit的灰度。

type Gray struct {
    Y uint16
}

func (c Gray16) RGBA() (r, g, b, a uint32)

type Model         //Model接口实现了Convert方法,Model可以在它自己的颜色模型中将一种颜色转化到另一种。这种转换可能是有损的。

type Model interface {
    Convert(c Color) Color
}

其中基本的颜色模型Model如下所示:

var (
    RGBAModel    Model = ModelFunc(rgbaModel)
    RGBA64Model  Model = ModelFunc(rgba64Model)
    NRGBAModel   Model = ModelFunc(nrgbaModel)
    NRGBA64Model Model = ModelFunc(nrgba64Model)
    AlphaModel   Model = ModelFunc(alphaModel)
    Alpha16Model Model = ModelFunc(alpha16Model)
    GrayModel    Model = ModelFunc(grayModel)
    Gray16Model  Model = ModelFunc(gray16Model)
)

而YCbCrModel是Y'CbCr颜色的模型

var YCbCrModel Model = ModelFunc(yCbCrModel)

func ModelFunc(f func(Color) Color) Model  //ModelFunc返回一个Model,它可以调用f来实现转换。

type NRGBA            //NRGBA代表一个没有32位透明度加乘的颜色。每个红,绿,蓝和透明度都是8bit的数值

type NRGBA struct {
    R, G, B, A uint8
}

func (c NRGBA) RGBA() (r, g, b, a uint32)

type NRGBA64         //NRGBA64代表无透明度加乘的64-bit的颜色,它的每个红,绿,蓝,和透明度都是个16bit的数值。

type NRGBA struct {
    R, G, B, A uint16
}

func (c NRGBA64) RGBA() (r, g, b, a uint32)

type Palette         //Palette是颜色的调色板

type Palette []Color

func (p Palette) Convert(c Color) Color    //返回欧式r g b空间中最接近color c 的调色板颜色
func (p Palette) Index(c Color) int   //Index在Euclidean R,G,B空间中找到最接近c的调色板对应的索引。

type RGBA         //RGBA代表一个传统的32位的预乘透明度的颜色,它的每个红,绿,蓝,和透明度都是个8bit的数值。

type RGBA struct {
    R, G, B, A uint8
}

func (c RGBA) RGBA() (r, g, b, a uint32)

type RGBA64       //RGBA64代表一个64位的预乘透明度的颜色,它的每个红,绿,蓝,和透明度都是个8bit的数值。

type RGBA64 struct {
    R, G, B, A uint16
}

func (c RGBA64) RGBA() (r, g, b, a uint32)

type YCbCr        //YCbCr代表了完全不透明的24-bit的Y'CbCr的颜色,它的每个亮度和每两个色度分量是8位的。

type YCbCr struct {
    Y, Cb, Cr uint8
}

JPEG,VP8,MPEG家族和其他一些解码器使用这个颜色模式。每个解码器经常将YUV和Y'CbCr同等使用,但是严格来说,YUV只是用于分析视频信号,Y' (luma)是Y (luminance)伽玛校正之后的结果。

RGB和Y'CbCr之间的转换是有损的,并且转换的时候有许多细微的不同。这个包是遵循JFIF的说明:http://www.w3.org/Graphics/JPEG/jfif3.pdf

func (c YCbCr) RGBA() (r uint32,g uint32,b uint32,a uint32)

`