這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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)