golang中image/color包的用法

chenbaoke · · 11500 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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)

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:chenbaoke

查看原文:golang中image/color包的用法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11500 次点击  
加入收藏 微博
下一篇:golang monogdb
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传